簡體   English   中英

如何在python中找到pow(a,b,c)的指數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM