0

我是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)));

我收到一个错误,显示 & [ ] 0Ccompo1ptr [not a vector] (t_INT) 中的类型不正确,我很确定其余代码工作正常,因为该错误仅在我放置时发生

temp1 = inverse (temp,modulus)

在。

4

2 回答 2

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;
}
于 2020-08-05T02:25:29.627 回答
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的只是将多项式与 of 的行列式进行true比较false

于 2017-12-08T21:16:23.440 回答