【发布时间】:2021-05-21 23:18:58
【问题描述】:
我遇到了一个问题:如果对 (p-1)/2 使用经典除法,那么 512 位奇数的代码会非常慢。但是使用地板分割它可以立即起作用。是浮点数转换造成的吗?
def solovayStrassen(p, iterations):
for i in range(iterations):
a = random.randint(2, p - 1)
if gcd(a, p) > 1:
return False
first = pow(a, int((p - 1) / 2), p)
j = (Jacobian(a, p) + p) % p
if first != j:
return False
return True
完整代码
import random
from math import gcd
#Jacobian symbol
def Jacobian(a, n):
if (a == 0):
return 0
ans = 1
if (a < 0):
a = -a
if (n % 4 == 3):
ans = -ans
if (a == 1):
return ans
while (a):
if (a < 0):
a = -a
if (n % 4 == 3):
ans = -ans
while (a % 2 == 0):
a = a // 2
if (n % 8 == 3 or n % 8 == 5):
ans = -ans
a, n = n, a
if (a % 4 == 3 and n % 4 == 3):
ans = -ans
a = a % n
if (a > n // 2):
a = a - n
if (n == 1):
return ans
return 0
def solovayStrassen(p, iterations):
for i in range(iterations):
a = random.randint(2, p - 1)
if gcd(a, p) > 1:
return False
first = pow(a, int((p - 1) / 2), p)
j = (Jacobian(a, p) + p) % p
if first != j:
return False
return True
def findFirstPrime(n, k):
while True:
if solovayStrassen(n,k):
return n
n+=2
a = random.getrandbits(512)
if a%2==0:
a+=1
print(findFirstPrime(a,100))
【问题讨论】:
-
那么输入是什么?
-
不管为什么,我什至不会考虑使用纯Python来实现一段高性能代码。原生库或类似 Cython 的库的性能可以比单独使用 Python 好数千倍。 Python 易于阅读和编写,但它的速度并不快。
-
准确显示您运行的内容。
pow(a, (p - 1) / 2, p)应该引发异常:TypeError: pow() 3rd argument not allowed unless all arguments are integers -
@superbrain 不确定 Cython。此外,每个单独的划分都可能由 C 完成,但需要转换和设置浮动对象。 Python浮点除法的源码在这里:github.com/python/cpython/blob/master/Objects/…
-
@RandomDavis 你确定速度差异的真正原因不是
/给出了错误的结果,对算法产生了负面影响吗?
标签: python division integer-division floor-division