首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算离散对数

计算离散对数
EN

Stack Overflow用户
提问于 2009-12-02 20:27:57
回答 6查看 13.5K关注 0票数 11

给定正整数b, c, m,其中(b < m) is True是找到一个正整数e,使得

代码语言:javascript
复制
(b**e % m == c) is True

其中**是求幂(例如,在Ruby、Python或^中,在其他一些语言中),%是模运算。解决这个问题的最有效的算法(具有最低的big-O复杂度)是什么?

示例:

给定b=5;c=8;m=13,此算法必须找到e=7,因为5**7%13 =8

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-12-02 20:47:24

这根本不是一个简单的问题。它被称为计算discrete logarithm,它是与modular exponentation相反的操作。

目前还没有已知的有效算法。也就是说,如果N表示m中的位数,则所有已知算法都在O(2^(N^C))中运行,其中C>0。

票数 14
EN

Stack Overflow用户

发布于 2009-12-02 20:34:43

通过%运算符,我假设您正在处理整数。

您正在尝试解决the Discrete Logarithm问题。一个合理的算法是Baby step, giant step,尽管还有许多其他算法,它们都不是特别快。

寻找离散对数问题的快速解决方案的困难是一些流行密码算法的基本部分,所以如果你在维基百科上找到了比任何一个更好的解决方案,请让我知道!

票数 29
EN

Stack Overflow用户

发布于 2019-11-02 03:59:35

Python 3解决方案:

值得庆幸的是,SymPy已经为您提供了implemented

SymPy是一个用于符号数学的Python库。它的目标是成为一个功能齐全的计算机代数系统(CAS),同时保持代码尽可能简单,以便易于理解和扩展。SymPy完全是用Python语言编写的。

这是documentation on the discrete_log函数。使用此命令将其导入:

代码语言:javascript
复制
from sympy.ntheory import discrete_log

他们的示例计算\log_7(15) (mod 41)

代码语言:javascript
复制
>>> discrete_log(41, 15, 7)
3

因为它采用了(最先进的)算法来解决这个问题,所以你会在你尝试的大多数输入上得到O(\sqrt{n})。当你的素数模具有p - 1因式成许多素数的性质时,速度会快得多。

考虑一个100位的素数:(~ 2^{100})。在复杂度为\sqrt{n}的情况下,这仍然是2^{50}次迭代。话虽如此,但不要重复发明轮子。这项工作做得很好。我还可以补充说,当我使用大容量输入(44 MiB vs. 173 MiB)运行时,它的内存效率几乎是Mathematica的MultiplicativeOrder函数的4倍。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1832617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档