*应该*计算原始根模数n的Maple代码

时间:2015-01-28 23:25:23

标签: maple

代码是:

primroot:=proc(n)  
  local tot,i,j, facts,l,k;  
  tot:=phi(n);  
  facts:=factorset(tot);  
  for i from 2 to n-1 do  
    for j from 1 to nops(facts)-1 do   
      for k  from 1 to nops(facts) -j  do  
        if  (i^(tot/(facts[j]))mod(n)!= 1) and ((i)^((tot)/(facts[j+k]))mod(n) !=1 )   
              then print(i);
               fi;  
       end do;   
      end do;  
     end do; 
    end proc:

这个程序适用于有两个因素的phi(n)值,但其他任何因素都会给出垃圾答案。

谁能告诉我哪里出错了? 谢谢!它在枫树看起来更漂亮,对不起看起来像这样!

1 个答案:

答案 0 :(得分:0)

在所有因素中,您的 if 语句仅在决定打印 i 之前检查两个。所以,当然,只有两个因素才有效,否则可能会失败。此外,Maple"不等于"运营商<> ,而不是!=

这是我的原始根过程,它使用与您相同的变量名称和通用编码样式:

#Returns set of all primitive roots mod n.
primroot:= proc(n::posint)
uses NT= numtheory;
local tot:= NT:-phi(n), facts:= NT:-factorset(tot), i, j, ok, r:= table();
     if n=2 then return {1} fi;
     for i from 2 to n-1 do
          if igcd(i,n) <> 1 then next fi;
          ok:= true;
          for j in facts while ok do
               ok:= evalb(i&^(tot/j) mod n <> 1) 
          end do;
          if ok then r[i]:= i; fi
     end do;
     {indices(r, 'nolist')}
end proc:

在函数式编程风格中编写和理解更容易:

primroot:= proc(n::posint)
uses NT= numtheory;
local tot:= NT:-phi(n), facts:= NT:-factorset(tot);
     select(i-> igcd(i,n)=1 and andmap(j-> i&^(tot/j) mod n <> 1, facts), {$1..n-1})
end proc: