[英]How to find exponent of pow(a,b,c) in python
python 中的pow(a,x,c)
運算符返回(a**x)%c
。 如果我有 a、c 的值和這個操作的結果,我如何找到 x 的值?
另外,這是我擁有的所有信息
pow(a,x,c) = pow(d,e,c)
我知道 a、c、d 和 e 的值的地方。
這些數字非常大(a = 814779647738427315424653119, d = 3, e = 40137673778629769409284441239, c = 122333444455565576777777777777777767776777777777777777777777777777777777777777777777777777777777777777777777777777777777777777677777777767767777767777767777767767777677767776
我知道可用於求解 a 的Carmichael lambda 函數,但我不確定這是否和/或如何適用於求解 x。
任何幫助將不勝感激。
正如@user2357112 在評論中所說,這是離散對數問題,對於大 c 來說計算非常困難,並且沒有已知的快速通用解決方案。
但是,對於小c,您仍然可以做一些事情。 鑒於 a 和 c 互質,存在指數 k < c,使得 a^k = 1 mod c,之后冪重復。 讓 b = a^x。 因此,如果您通過計算 a 的所有冪直到得到 b 來強制執行它,則您最多必須循環 c 次:
def do_log(a, b, c):
x = 1
p = a
while p != b and p != 1:
x += 1
p *= a
p %= c
if p == b:
return x
else:
return None # no such x
如果使用相同的 a 多次運行此計算,則可以做得更好。
# a, c constant
p_to_x = {1: 0}
x = 1
p = a
while p != 1:
p_to_x[p] = x
x += 1
p *= a
p %= c
def do_log_a_c(b):
return p_to_x[b]
這里的緩存是在最多運行 c 次的循環中創建的,並在日志函數中訪問緩存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.