【问题标题】:pari gp return function store in variablepari gp 返回函数存储在变量中
【发布时间】:2014-11-15 19:32:59
【问题描述】:

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

在。

【问题讨论】:

  • 感谢您更新问题以在报告错误的行与您的讨论开始的函数inverse 之间建立联系。它似乎仍然不是问题的a minimal, complete and verifiable illustration。是否有必要(为了说明)将对inverse 的调用置于双重嵌套循环中?在这个 sn-p 中,我们看不到参数 temp,modulus 是如何被赋值的。如果 inverse 被调用一次并带有显式参数会发生什么?等等。
  • @hardmath。谢谢回复。反函数将打印出正确答案。如果我把它放在循环中。它不起作用,我会得到那个错误。
  • 给我看代码!策略:一件事有效,另一件事无效。缩小差异。要做到这一点,您必须能够同时看到两者,并进行更改直到错误被隔离。

标签: pari pari-gp


【解决方案1】:

这里的部分问题是您没有在函数中确定变量的范围。特别是您在函数内部和外部都使用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 的行列式进行比较。

【讨论】:

    【解决方案2】:

    将您的函数替换为具有适当范围变量的函数应该可以解决问题。试试这个:

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-07-30
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多