代码是:
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)值,但其他任何因素都会给出垃圾答案。
谁能告诉我哪里出错了? 谢谢!它在枫树看起来更漂亮,对不起看起来像这样!
答案 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: