pari gp返回函数存储在变量中

时间:2014-11-15 19:32:59

标签: pari pari-gp

我是pari gp的新手,只是尝试一下,玩它。 我有一个像这样的反函数。

inverse (a,n) = 
{
  negative = false;

  if (a < 0, negative = true);
  if (a < 0, a= a*-1);

  i = n;
  v = 0;
  d = 1;

  while (a>0,t=i/a; x =a;
        a = i % x;
        i = x;
        x = d;
        d = v - t*x;
        v = x);
    v %= n;

  if (v < 0, v = (v+n)%n);


  if (negative == true, return (-v));

  return (v);
};

所以我有一个主要功能,包括这样的东西。

while (i<n,i++;
    while(j<n,j++;
      // some other codes
      temp1 = inverse(temp,modulus)));

我收到的错误是&amp; [] 0Ccompo1ptr [不是矢量](t_INT)中的错误类型 我很确定其余的代码工作正常,因为错误只发生在我放置

temp1 = inverse (temp,modulus)

2 个答案:

答案 0 :(得分:0)

这里的部分问题是你没有在函数中使用变量。特别是你在函数内部和外部使用i。这些都没有在PARI用户手册中得到很好的解释。要使变量成为局部变量,您需要执行类似my(i=n);的操作。某些变量会自动确定范围,例如函数和sum(i=1,10,i); vector(10,i,i^2); for(i=1,10,...)等参数,但不是i=n之类的简单赋值。另请注意,PARI没有布尔常量truefalse。您的代码在这种情况下有效,因为您正在执行negative==true,它只是将多项式与truefalse的不确定性进行比较。

答案 1 :(得分:0)

用具有适当作用域的变量替换您的函数应该可以解决该问题。试试这个:

inverse (a,n) = 
{
  if (a < 0, return(-inverse(-a, n)));
  my(i = n, v = 0, d = 1);
  while (a > 0,
    my(x = a, t);
    [t, a] = divrem(i,a);
    i = x;
    [d, v] = [v - t*x, d];
  );
  v % n;
}