python中求平方根时的截断错误
我想用费马的因式分解法 使用python中求平方根时的截断错误,python,rsa,truncate,prime-factoring,square-root,Python,Rsa,Truncate,Prime Factoring,Square Root,我想用费马的因式分解法 使用n=pq=17113393402958118715148546526344227921745898507742510282855190555424972779474416264134494113作为RSA练习的因子 以下是我的python代码: def isSquare(x): return pow(int(sqrt(x)),2) - x == 0 n = 171133934029581187151485465263442279217814589
n=pq=17113393402958118715148546526344227921745898507742510282855190555424972779474416264134494113作为RSA练习的因子
以下是我的python代码:
def isSquare(x):
return pow(int(sqrt(x)),2) - x == 0
n = 17113393402958118715148546526344227921781458985077442510282855190555424972779474416264134494113
for i in xrange(10):
print isSquare(n+i*i)
当我执行时,它会打印所有的True
s,这是不正确的。我认为这是python中的截断错误。我该怎么处理呢?谢谢
def isqrt(n):
x = n
y = (x + n // x) // 2
while y < x:
x = y
y = (x + n // x) // 2
return x
print isqrt(99999999999**2)
for i in xrange(130000,140000):
if isqrt(n + i*i) ** 2 == n + i*i:
print isqrt(n + i*i)
print "done"
def isqrt(n):
x=n
y=(x+n//x)//2
当y
math.sqrt使用不精确的浮点数
最简单的方法可能是将sqrt更改为整数isqrt函数,您只需从math复制体面的isqrt实现即可。sqrt使用不精确的浮点数
最简单的方法可能是将sqrt更改为整数isqrt函数,您只需从math复制体面的isqrt实现即可。sqrt使用不精确的浮点数
最简单的方法可能是将sqrt更改为整数isqrt函数,您只需从math复制体面的isqrt实现即可。sqrt使用不精确的浮点数
最简单的方法可能是将sqrt更改为整数isqrt函数,您只需从复制像样的isqrt实现即可。您可以使用牛顿方法查找数字的整数平方根:
def isqrt(n):
x = n
y = (x + n // x) // 2
while y < x:
x = y
y = (x + n // x) // 2
return x
def isqrt(n):
x=n
y=(x+n//x)//2
当y
这将返回最大整数x,使得x×x不超过n
但是Fermat的方法不太可能将你的95位RSA半素数因子化。您应该查看二次筛或数字域筛来计算该大小的数字。您可以使用牛顿法来计算数字的整数平方根:
def isqrt(n):
x = n
y = (x + n // x) // 2
while y < x:
x = y
y = (x + n // x) // 2
return x
def isqrt(n):
x=n
y=(x+n//x)//2
当y
这将返回最大整数x,使得x×x不超过n
但是Fermat的方法不太可能将你的95位RSA半素数因子化。您应该查看二次筛或数字域筛来计算该大小的数字。您可以使用牛顿法来计算数字的整数平方根:
def isqrt(n):
x = n
y = (x + n // x) // 2
while y < x:
x = y
y = (x + n // x) // 2
return x
def isqrt(n):
x=n
y=(x+n//x)//2
当y
这将返回最大整数x,使得x×x不超过n
但是Fermat的方法不太可能将你的95位RSA半素数因子化。您应该查看二次筛或数字域筛来计算该大小的数字。您可以使用牛顿法来计算数字的整数平方根:
def isqrt(n):
x = n
y = (x + n // x) // 2
while y < x:
x = y
y = (x + n // x) // 2
return x
def isqrt(n):
x=n
y=(x+n//x)//2
当y
这将返回最大整数x,使得x×x不超过n
但是Fermat的方法不太可能将你的95位RSA半素数因子化。您应该查看二次筛选或数字字段筛选,以将该大小的数字作为因子。您可以尝试在模块数学之外使用sqrt()函数。代码可能如下所示:
import math
n = math.sqrt(int(raw_input("Enter a number\n")))
print n
您可以尝试在模块数学之外使用sqrt()函数。代码可能如下所示:
import math
n = math.sqrt(int(raw_input("Enter a number\n")))
print n
您可以尝试在模块数学之外使用sqrt()函数。代码可能如下所示:
import math
n = math.sqrt(int(raw_input("Enter a number\n")))
print n
您可以尝试在模块数学之外使用sqrt()函数。代码可能如下所示:
import math
n = math.sqrt(int(raw_input("Enter a number\n")))
print n
math.sqrt()
在float
上运行(它无法保持您似乎需要的范围)。我建议使用Decimal
,或者更好的是使用一个数学库。您可以使用著名的SymPy
库来实现这一点:math.sqrt()
对float
进行操作(它无法保持您似乎需要的范围)。我建议使用Decimal
,或者更好的是使用一个数学库。您可以使用著名的SymPy
库来实现这一点:math.sqrt()
对float
进行操作(它无法保持您似乎需要的范围)。我建议使用Decimal
,或者更好的是使用一个数学库。您可以使用著名的SymPy
库来实现这一点:math.sqrt()
对float
进行操作(它无法保持您似乎需要的范围)。我会说使用Decimal
,或者更好的是使用一个数学库。你可以使用著名的SymPy
库来做到这一点:那么,如果I**2==n:返回I#raise ValueError('输入不是一个完美的正方形'),为什么这项工作更好else:return 0我指的是最佳答案中的代码,而不是问题中的代码。我已经更正了链接,让它更精确。谢谢你,谢尔盖。//做什么?“//”是整数除法。7//2等于3。“/”在早期的Python版本中可以用作整数除法,但在较新的版本中,7/2是3.5;//在Python 2.7中也适用吗?那么,如果i**2==n:return i#raise ValueError('输入不是一个完美的正方形'),为什么定义isqrt(n):i=int(sqrt(n)+0.5会更好else:return 0我指的是最佳答案中的代码,而不是问题中的代码。我已经更正了链接,让它更精确。谢谢你,谢尔盖。//做什么?“//”是整数除法。7//2等于3。“/”在早期的Python版本中可以用作整数除法,但在较新的版本中,7/2是3.5;//在Python 2.7中也可以用作整数除法吗?那么,为什么在def isqrt(n)中使用它会更好呢