我需要从下面的等式中找到x
h = pow(g,x,p)
我有
的值h = 400 digit number
g = 400 digit number
p = 400 digit number
我需要找到x的值。
所有的价值都非常大。
我有不完整的x,其中有10个缺失的数字,并且它们不是连续缺失的数字。所有缺失数字的索引是不同的。
我正在使用10 for循环 每次都要取代那个值来获得H.在python中花费太多时间才能做到这一点。无论如何,我可以更快地完成它。
答案 0 :(得分:2)
不要拨打pow()
一百亿次。相反,使用它来计算h
的第一个值,然后通过将前一个值乘以g
(或g
在该情况下提升到适当的幂10来计算每个连续值缺少的数字不在x
)的末尾。
这是一个有效的例子,可以在几秒钟内找到7个缺失的数字。它应该在几个小时内给出10个缺失数字的答案。但正如其他人所指出的那样,通过将此代码移植到另一种语言(如C语言),您将获得更好的性能。
h = 27029080272084173153635398406622455117429159185281491773519587480106092289627
g = 26376362132555166607008315364046996472951702119314003469217622667073785183917
p = 81593331324697655999776287731387256090095437693547587289127550085992860325943
x = 31952256647378403805884540140134925446045889939629675712565170000000381638216
# The missing digits (3897858): ^^^^^^^
z = pow(g, x, p) # Initial value of h
d = pow(g, 10**9, p) # Multiplier to get next value of h
while z != h:
z = (z * d) % p
x += 10**9 # Increment x at position of last unknown digit
print(x)
修改强>
如果丢失的数字不是连续的,那么您仍然可以使用类似的方法,但不是每次都将x递增相同的数量,而是需要密切关注每一步中哪些数字正在变化。例如,给定一个数字.0.....0...0..
,其中0
表示缺少的数字,而.
表示已知数字,您需要在递增最后一个未知数时添加100
数字,9999100
当最后一个未知数字达到9时,999990999100
当最后两个未知数字都是9时。对于任何模式都不应该太难找出正确的增量未知数字。
.0.....0...0.. + 100
.0.....0...1.. + 100
.0.....0...2.. + 100
: : :
.0.....0...8.. + 100
.0.....0...9.. + 9999100
.0.....1...0.. + 100
.0.....1...1.. + 100
: : :
.0.....1...9.. + 9999100
.0.....2...0.. + 100
: : :
.0.....9...9.. + 999990999100
.1.....0...0.. + 100
: : :
这应该在可行的时间内以10个未知数字运行,但是对于更快的解决方案,请使用James K Polk在下面的评论中建议的中间会合方法。