从数论中寻找原始根的算法

时间:2018-11-01 06:40:24

标签: numbers modular-arithmetic

我想实现一个程序,用于查找给定素数的给定素数,为此,我编写了以下三个程序

function primitive_roots=primitive_root(p)
    if ~isprime(p) 
        error(' p must be  prime number '); 
    end
    primitive_roots=[];
    n=phi(p);
    k=p-1;
    for ii=2:n
        if power_mod(ii,k,p)==1
            primitive_roots=[primitive_roots,ii];
        end
    end

end

还有power_mod函数

function modresult=power_mod(a,b,c)
%  this program will calculate  a^b mod c
i=0;
result=1;
while i<b
    result=mod(result*a,c);
    i=i+1;
end
modresult=result;


end

和欧拉totient功能

 function  phin=phi(n)
    % this function will calculates how many coprime number exist for  given n, coprime number must be
    %less then n

    if isprime(n)  % if number is  prime
        phin=(n-1);
    end
    factors=unique(factor(n));% will printt unique prime divisors of given n
    k=1; % counter
    for ii=1:length(factors)
        k=k*(1-1/factors(ii));
    end
    phin=k*n;



    end

但是例如第一个程序给我错误的结果

>> primitive_roots=primitive_root(19)

primitive_roots =

  Columns 1 through 14

     2     3     4     5     6     7     8     9    10    11    12    13    14    15

  Columns 15 through 17

    16    17    18

>> 

Wolfram Alhpa给我不同的结果

https://www.wolframalpha.com/widgets/view.jsp?id=ef51422db7db201ebc03c8800f41ba99

请帮助我

1 个答案:

答案 0 :(得分:0)

我已经解决了该程序,为此我引入了附加功能,该功能将计算所有可能的功率,然后检查最小的功率

function all_powers=powers_list(a,p)
all_powers=[];
for ii=1:p-1
    if power_mod(a,ii,p)==1  %  finding all powers 
        all_powers=[all_powers,ii];
    end
end



end

    function primitive_roots=primitive_root(p)
    if ~isprime(p) 
        error(' p must be  prime number '); 
    end
    primitive_roots=[];
    n=phi(p);
    k=p-1;
    for ii=2:p-1
        if power_mod(ii,k,p)==1
            all_powers=powers_list(ii,p);
            if (min(all_powers)==(p-1))
            primitive_roots=[primitive_roots,ii];
        end
    end

end

>> primitive_roots=primitive_root(5)

primitive_roots =

     2     3

>> primitive_roots=primitive_root(7)

primitive_roots =

     3     5

>> primitive_roots=primitive_root(19)

primitive_roots =

     2     3    10    13    14    15

>> primitive_roots=primitive_root(23)

primitive_roots =

     5     7    10    11    14    15    17    19    20    21

>>