OCaml中的多项式长除法

OCaml中的多项式长除法,ocaml,warnings,Ocaml,Warnings,我正在尝试基于int数组类型的多项式实现多项式长除法。此处,最高阶系数位于末尾。我的代码基于维基百科上的伪代码: function n / d is require d ≠ 0 q ← 0 r ← n // At each step n = d × q + r while r ≠ 0 and degree(r) ≥ degree(d) do t ← lead(r) / lead(d) // Divide the

我正在尝试基于int数组类型的多项式实现多项式长除法。此处,最高阶系数位于末尾。我的代码基于维基百科上的伪代码:

function n / d is
    require d ≠ 0
    q ← 0
    r ← n             // At each step n = d × q + r

    while r ≠ 0 and degree(r) ≥ degree(d) do
        t ← lead(r) / lead(d)       // Divide the leading terms
        q ← q + t
        r ← r − t × d

    return (q, r)

H

这条线

q = poly_add q t
正在测试
q
poly_add q t
之间的相等性,这不是赋值,编译器警告您忽略此测试的结果。你也误解了你的伪代码:
t
应该是一个次多项式
次r-次d

您需要使用引用,或者将while循环转换为递归函数

同样,由于
r
是一个数组,其长度不能更改:

  while ((Array.length r) >= n2) && (Array.length r != 0)do
此测试在循环期间不会更改。结构不等式是

另一个问题是这条线

 t.(0) <- r.((Array.length r)-1)/p2.(n2-1)

t.(0)我认为在这种情况下它们应该是可变的,所以我想我会先尝试将它们转换为引用。在这种情况下,如果我使用q:=这变成了一个赋值正确吗?如果多项式应该是可变的(也就是说任何人都可以改变多项式的内容),那么你就不能公开一个零多项式(你可以有一个零多项式生成器:unit->polyman),你需要一个复制函数。请注意,具有可变多项式与具有对(可变或不可变)多项式的可变引用无关。是的,参考作业是
:=
。嗯,好吧,我误解了你的意思。我的意思是,它们在函数中是可变的,因此它们需要作为引用传递。我更改了代码,但现在在这行:!t:=Array.make 1(!r.((Array.length!r)-1))/p2(n2-1);我得到一个错误:错误:这个表达式的类型是polynomy=int数组,但是一个表达式的类型应该是'a ref,但是t=ref zero\u pol,所以我不知道它来自哪里。我在我的问题中添加了新的代码抱歉,我刚刚读到我误解了t本身,我现在正在研究:)你好,再次@octachron,我已经尝试了,但我不知道如何实现t。我的代码当前处于与更新中相同的状态,您将如何实现“t”,或者通常如何使用多项式函数实现伪代码?