Sage 米勒-拉宾素性检验

Sage 米勒-拉宾素性检验,sage,primality-test,Sage,Primality Test,我想用SAGE编写Miller-Rabin素性测试。这是我的密码: def miller(n,k): i=1 s=(n-1).valuation(2) t=(n-1)/(2**s) while(i>0 and i<=k): a=randint(3,n-3) if gcd(a,n)!=1: i=0 else: y=a**t%n if y!=1 and y!=n-1: j=1

我想用SAGE编写Miller-Rabin素性测试。这是我的密码:

def miller(n,k):
i=1
s=(n-1).valuation(2)
t=(n-1)/(2**s)
while(i>0 and i<=k):
    a=randint(3,n-3)
    if gcd(a,n)!=1:
        i=0
    else:
        y=a**t%n
        if y!=1 and y!=n-1:
            j=1
            while(j>0 and j<=s-1 and y!=n-1):
                y=y**2%n
                if y==1:
                    j=0
                else:
                    j=j+1
            if y!=n-1:
                i=0
        if i>0:
            i=i+1
if i==0:
    print "n composite"
else:
    print "n probably prime"
def miller(n,k):
i=1
s=(n-1).估值(2)
t=(n-1)/(2**s)
而(i>0,i0和j0:
i=i+1
如果i==0:
打印“n复合”
其他:
打印“n可能是素数”

它适用于不太小的数字,但是适用于n=3847982374893247238947238473289472348784923748723483732748923748932473237239423894782394479273“指数必须最多为9223372036854775807”。我希望得到任何建议:)

您可能想用
mod(x,z)^y
之类的模式替换模式
x^y%z
,所以你在模约化后进行幂运算(即更小的值)。是的,这绝对是个问题。简单地替换为
y=mod(a,n)^t
就产生了
n可能素数
:请参见。您可能希望将模式
x^y%z
替换为类似
mod(x,z)^y
的模式,因此在模化后进行幂运算(即更小的值)。是的,这肯定是一个问题。简单地替换为
y=mod(a,n)^t
n可能是prime
:请参阅。