代码之家  ›  专栏  ›  技术社区  ›  dede9714

数的本原根

  •  1
  • dede9714  · 技术社区  · 9 年前

    我已尝试实现中描述的算法 here 找到素数的本原根。

    它适用于小素数,但当我尝试大数字时,它不再返回正确答案。

    然后我注意到 a^(p-1)/pi 往往是一个很大的数字,它会返回 inf 在MATLAB中,所以我认为 (p-1) 可能会有帮助,但我不知道怎么做。

    我用MATLAB写了一小段代码,就在这里。

    clear all
    clc
    
    %works with prime =23,31,37,etc.
    
    prime=761; %doesn't work for this value
    
    F=factor(prime-1); % the factors of prime-1
     for i = 2: prime-1
            a=i;
            tag =1;
            for j= 1 :prime-1
                if (isprime(j))
                     p_i = j;
                     if(mod(a^((prime-1)/p_i),prime)== 1)
                         tag=0;
                         break 
                    else
                        tag = tag +1;
                     end
                end
            end
            if (tag > 1 )
                a %it should only print the primitive root
                break
            end
    end
    

    欢迎任何意见。 谢谢

    1 回复  |  直到 9 年前
        1
  •  1
  •   RPM    9 年前

    在这种情况下,Matlab所做的是计算 a^((p-1)/p) 在取模量之前。像 a^((p-1)/p) 很快变得太大而无法处理,Matlab似乎通过将其转换为浮点数来解决这一问题,在计算模数时会丢失一些分辨率并产生错误的结果。

    正如@rayreng所提到的,您可以使用任意精度工具箱来解决这个问题。

    或者,你可以把求幂分解成几个部分,在每个阶段取模。这应该更快,因为它占用的内存更少。您可以将其转储到函数中,然后调用它。

    % Calculates a^b mod c
    i = 0;
    result = 1;
    
    while i < b
        result = mod(result*a, c);
        i = i + 1;
    end