1.python自带函数缺陷
1.1pow()和sqrt()
pow()和math.sqrt(),以及**0.5的运算性质相同,对于大整数求解精度不高:
N=2491088917426733811725932992928748144806955379070084981859423461184276808893250106524506561409641097047378338533226586836156446516229863220375883799563423233589
print((N**0.5)**2)
print(N)
结果:
1.2decimal库
decimal库可以很好处理高精度数据,但不可进行开方运算
2.直接二分法算
def sqrt_binary_search(n):
if n < 0:
raise ValueError("输入必须是非负整数")
if n == 0 or n == 1:
return n
# 二分查找范围是 [1, n]
start, end = 1, n
result = 1
while start <= end:
mid = (start + end) // 2
if mid * mid == n:
return mid
elif mid * mid < n:
start = mid + 1
result = mid # 记录当前的中间值,可能是答案
else:
end = mid - 1
return result
N=2491088917426733811725932992928748144806955379070084981859423461184276808893250106524506561409641097047378338533226586836156446516229863220375883799563423233589
res1=sqrt_binary_search(N)
print(res1**2)
print(N)
问gpt的,不过得出来的解为整数,但对于大整数而言求小数部分没意义,起码在密码这方面是这样的
结果:
res1稍微小一点,在求解费马攻击时res1+1即可认定略大于根号n