如何评估以素数为模的指数塔

2023-11-22

我想找到一种快速算法来评估如下所示的表达式,其中P是素数。

A ^ B ^ C ^ D ^ E mod P

Example:

(9 ^ (3 ^ (15 ^ (3 ^ 15)))) mod 65537 = 16134

问题是中间结果可能会变得太大而无法处理。


基本上问题归结为计算a^T mod m对于给定的a, m和一个术语T那是大得离谱。然而,我们可以评估T mod n给定模数nT。所以我们问:“是否有一个整数n,使得a^(T mod n) mod m = a^T mod m?"

Now if a and m是互质的,我们知道n = phi(m)满足我们的条件欧拉定理:

  a^T                               (mod m)
= a^((T mod phi(m)) + k * phi(m))   (mod m)    (for some k)
= a^(T mod phi(m)) * a^(k * phi(m)) (mod m)
= a^(T mod phi(m)) * (a^phi(m))^k   (mod m)
= a^(T mod phi(m)) * 1^k            (mod m)
= a^(T mod phi(m))                  (mod m)

如果我们可以计算phi(m)(这很容易做到,例如O(m^(1/2))或者如果我们知道素因数分解m),我们将问题简化为计算T mod phi(m)和一个简单的模幂.

What if a and m不是互质的吗?情况并不像以前那么愉快,因为可能没有有效的n与财产a^T mod m = a^(T mod n) mod m对全部T。然而,我们可以证明序列a^k mod m for k = 0, 1, 2, ...在某个点之后进入循环,即存在x and C with x, C < m,使得a^y = a^(y + C)对全部y >= x.

Example: For a = 2, m = 12,我们得到序列2^0, 2^1, ... = 1, 2, 4, 8, 4, 8, ... (mod 12)。我们可以看到带参数的循环x = 2 and C = 2.

我们可以通过暴力计算序列元素来找到循环长度a^0, a^1, ...直到找到两个索引X < Y with a^X = a^Y。现在我们设置x = X and C = Y - X。这给了我们一个算法O(m)每次递归求幂。

如果我们想做得更好怎么办?谢谢于尔基·拉赫托宁来自 Math Exchange 提供以下算法的要点!

让我们评估一下序列d_k = gcd(a^k, m)直到我们找到一个x with d_x = d_{x+1}。这最多需要log(m)GCD 计算,因为x受质因数分解中最高指数的限制m. Let C = phi(m / d_x). 我们现在可以证明 a^{k + C} = a^k对全部k >= x,所以我们找到了循环参数O(m^(1/2)) time.

假设我们已经找到了x and C并想要计算a^T mod m现在。 如果T < x,通过简单的模幂运算来执行该任务是微不足道的。否则,我们有T >= x因此可以利用循环:

  a^T                                     (mod m)
= a^(x + ((T - x) mod C))                 (mod m)
= a^(x + (-x mod C) + (T mod C) + k*C)    (mod m)     (for some k)
= a^(x + (-x mod C) + k*C) * a^(T mod C)  (mod m)
= a^(x + (-x mod C)) * a^(T mod C)        (mod m)

同样,我们将问题简化为相同形式的子问题(“计算T mod C") 和两个简单​​的模幂。

由于每次迭代中模量至少减少 1,因此我们得到了一个相当弱的界限O(P^(1/2) * min (P, n))对于该算法的运行时间,其中n是堆栈的高度。在实践中,我们应该会变得更好,因为模量预计会呈指数下降。当然这个论点有点夸张,也许一些更喜欢数学的人可以改进它。

有一些边缘情况需要考虑,实际上可以让你的生活变得更轻松:如果出现以下情况,你可以立即停止:m = 1(本例中结果为 0)或者如果a是的倍数m(在这种情况下结果也是 0)。

EDIT:可以证明x = C = phi(m)是有效的,因此作为一种快速而肮脏的解决方案,我们可以使用以下公式

a^T = a^(phi(m) + T mod phi(m))  (mod m)

for T >= phi(m)甚至T >= log_2(m).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何评估以素数为模的指数塔 的相关文章

  • Diamond-Square 算法的平滑问题

    我正在使用菱形方形算法来生成随机地形 它工作得很好 除了我让这些大圆锥形状要么伸出或伸入地形 问题似乎在于 时不时会有一个点被设置得太高或太低 Here is a picture of the problem And it can be b
  • 从对列表创建邻接列表类型结构

    在 C 中 我有 class Pair int val1 int val2 我有一个来自以下来源的配对列表 List
  • 整数除法性质

    下面的整数算术性质成立吗 m n l m n l 起初我以为我知道答案 不成立 但现在不确定 它适用于所有数字还是仅适用于某些条件 即n gt l 该问题涉及计算机算术 即q n m q m n 忽略溢出 Case1 assume m kn
  • .NET 的符号数学

    我正在寻找 NET 框架的符号数学库 我看过Math net 但它还不是可用的 您知道是否还有其他图书馆存在吗 这可能有点过分了 但你可以和数学 http www wolfram com products mathematica index
  • 算法:找到圆中的峰值

    Given n排列成圆圈的整数显示了一种可以找到一个峰值的有效算法 峰值是不小于它旁边的两个数字的数字 一种方法是遍历所有整数并检查每个整数以查看它是否是峰值 这产生O n 时间 似乎应该有某种方法来分而治之 以提高效率 EDIT 好吧 基
  • 使用 stl sort 对表进行排序

    我有一个巨大的表 约 50Gb 格式为 i j k 来自稀疏矩阵 存储为 uint32 t idx1 idx2 float vals uint32 t tablesize 我想使用给定的比较函数 即 idx1 和 idx2 的函数 对其进行
  • 如何使用networkx删除有向图中的所有相关节点?

    我不确定我的问题的正确术语是什么 所以我只会解释我想做的事情 我有一个有向图 删除节点后我希望所有独立相关的节点也被删除 这是一个例子 假设我删除节点 11 我希望节点 2 也被删除 在我自己的示例中 它们将是 2 以下的节点 现在也必须删
  • Yegge 的原型模式示例如何处理实例变量?

    我喜欢史蒂夫 耶吉的原型模式示例 http steve yegge blogspot com 2008 10 universal design pattern html并决定快速制作一个概念验证示例 不过 我并没有真正考虑清楚 虽然它非常适
  • 在unity3D中显示数学方程

    我想使用它的 GUI 系统统一显示数学方程 有办法吗 我正在使用 C 语言在 Unity 中进行编程 如果我还可以使用 C 代码显示数学符号 这对我来说会很有用 谢谢 自 2016 年起 您可以使用TEXDraw https assetst
  • 随机排列

    我无法找到一种随机洗牌元素的好方法std vector经过一些操作后 恢复原来的顺序 我知道这应该是一个相当简单的算法 但我想我太累了 由于我被迫使用自定义随机数生成器类 我想我不能使用std random shuffle 无论如何这没有帮
  • 打印从 1 到 100 的质数

    此 C 代码打印出以下素数 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 但我不认为这就是我的书所希望的写作方式 它提到了一些关于数字的平方根的内容
  • 埃拉托斯特尼筛法是生成 1 到 N 素数的最佳算法吗?

    我在一次采访中被问到这个问题 我使用埃拉托色尼筛子概念和数组实现了一种算法 有没有更好的方法来解决这个问题 对于不知道筛子的人 请点击以下链接 http en wikipedia org wiki Sieve of Eratosthenes
  • 查找数组中 2 个缺失数字的最快方法

    这个问题的存在只是出于纯粹的好奇心 不是作业 找到在数组 1 n 中找到两个缺失数字的最快方法 因此 在相关帖子中 查找数字数组中缺失数字的最快方法 https stackoverflow com questions 2113795 qui
  • 如何从列中创建对称矩阵?

    例如 我想转动以下列 90 175 600 650 655 660 代入矩阵 90 175 600 650 655 660 175 600 650 655 660 655 600 650 655 660 655 650 650 655 66
  • 插入排序 - 如何接受输入并打印排序后的数组

    我试图做一个插入排序程序 它接受任何数据类型 Int Double String 然后打印排序后的数组 我知道我的代码可以工作 但我无法找出真正的问题 import java util public class MyInsertionSor
  • Python 将字符串组合成尽可能短的字符串?

    如果我有一个字符串列表 我想将它们组合成一个具有重叠字符的字符串 如果没有剩余的重叠字符串 请将其添加到末尾 这是一个过于简化的版本 input one two output twone 我正在寻找一种方法来对输入列表中的任意数量的字符串执
  • 如何为所有语言创建字母数字正则表达式?

    我今天遇到了这个问题 此正则表达式仅匹配英语 a zA Z0 9 如果我需要支持这个世界上的任何语言 我应该编写什么正则表达式 如果您使用字符类简写和 Unicode 识别正则表达式引擎 您就可以做到这一点 这 wclass 匹配 单词字符
  • Swift 中计算只读属性与函数

    在 Swift WWDC 简介会话中 只读属性description被证明 class Vehicle var numberOfWheels 0 var description String return numberOfWheels wh
  • 找到将一个数字转换为另一个数字的最小移动次数的算法

    假设我们有两个正整数 a 和 b 每次移动我们都可以将 a 除以 2 但前提是 a 是偶数 将 a 乘以 2 或者将 a 加 1 将a变为b需要多少步 找到一个直接公式或一种有效的算法 即以对数时间运行的算法 我取得的一些进展 我们可以把它
  • 获取Windows下新线程/删除线程的通知

    创建 DLL 时 您可以在 DllMain 函数 DLL THREAD ATTACH DLL THREAD DETACH 中获取有关新线程 退出线程的通知 有没有办法在 非托管 可执行文件中从 Windows 获取这些或等效通知 是的 在您

随机推荐

  • Boost Spirit可以用来解析字节流数据吗?

    Spirit Boost C 库的一部分 可以用来解析来自流的二进制数据吗 例如 它可以用来将来自套接字的数据解析为结构 字节和单独的位标志吗 谢谢 Boost Spirit 允许使用定义解析器扩展巴科斯 诺尔范式 EBNF 语法与模板元编
  • DataFrame 到列表的列表,不更改值的数据类型

    df values to list or list df values 将数据帧转换为列表列表 但整数值转换为浮点值 数据框是 HSCode value year 0 2 0 18 2018 1 3 0 00 2018 2 4 12 48
  • Django:查询使用包含列表中的每个值

    我需要执行 django 查询来检查字段是否包含列表中的所有值 该列表的长度会有所不同 Example User objects filter first name contains x y z import operator from d
  • 在 GCC 中动态创建 va_list - 可以做到吗?

    我的问题是vsprintf是我无法直接获取输入参数 我必须先逐一获取输入并将它们保存在void 然后通过这个void to vsprintf 对于windows来说一切都很好 但是当我来到64位linux时 gcc无法编译 因为它不允许从v
  • 如何使用 FB FQL 多重查询的结果?

    我对 Facebook 的 fql multiquery 方法感到困惑 我正在尝试检索一篇文章的所有评论 然后检索每个评论的用户信息 我可以毫无问题地获得评论 但我很难获得用户 目前我正在使用以下内容 FB api method fql m
  • Flask-OIDC redirect_uri 值在某处被覆盖?

    我已经安装了 Flask OIDC 并尝试使用我公司的服务对用户进行身份验证 我正在使用 client secrets json 文件 该文件正在正确读取 解析和发送 client id client secret 和其他值 我将redir
  • Meteor Up Docker 和 Graphicsmagick

    我正在寻找如何在 Meteor Up Docker 上安装 Graphicsmagick 我找到了这个解决方案 访问 docker 内的二进制文件 但我无法工作 我该把这些线放在哪里start sh meteorDockerId docke
  • VB / C#:平均调整两个控件的大小

    我创建了一个窗口 其中有两个组 面板以及它们之间的一些按钮 我想以一种方式对调整大小行为进行编码 当窗口扩展时 两个面板会增加宽度 同时保持它们之间的距离不变 请看这个模型 正如您在上面看到的 我希望调整 本地 和 服务器 面板的大小 同时
  • 如何查看Lucene索引

    我正在尝试学习和理解 lucene 是如何工作的 lucene 索引里面有什么 基本上我想看看数据在 lucene 索引中是如何表示的 我在用lucene core 8 6 0作为依赖 下面是我非常基本的 Lucene 代码 private
  • Spinner OnItemSelectedListener

    我找不到如何在单声道中执行此操作的示例 有什么帮助吗 编辑 添加代码 foreach equip item in list tr new TableRow this sp new Spinner this sp LayoutParamete
  • 使用 R 的日历时间序列

    如何制作日历时间序列图表this与ggplot2 我找不到任何东西 所以我继续写下来 Makes calendar time series plot The version rendered on the screen might look
  • 使用 mysqldump 备份具有 GEOMETRY 列的表?

    我最近创建了一个 MySQL 表 其中包含 GEOMETRY 类型的列 当我使用 mysqldump 备份表时 它将几何列输出为带引号的字符串 其中包含一些转义字符 例如 0 以及一些看起来像上位 ASCII 范围中的原始二进制字节的字符
  • 带有特殊字符的 NSURL

    如何编码此 url 以显示在 UIWebview 中 http de wikipedia org search Bev lkerungsentwicklung I tried stringByAddingPercentEscapesUsin
  • 在水平分割或垂直分割中打开窗口

    我希望同时打开 NERDTree 和 TagList 但我不需要它们具有屏幕的整个高度 相反 我想让它们在单个垂直分割中水平分割 更具体地说 我希望能够打开一个 NERDTree 并让它占据屏幕的整个高度 然后 当我打开 TagList 时
  • Python编程:仅在命令提示符下获取“名称'Tk'未定义”,在IDLE中有效[重复]

    这个问题在这里已经有答案了 刚开始使用 Tkinter 的初学者的问题 我下载了并写了教程Hello World程序 并且在 IDLE 下运行良好 但是 当我保存程序并使用命令提示符运行它时 它们都返回NameError name tk i
  • 如何将 scrapy.log 模块与自定义日志处理程序一起使用?

    我一直在研究一个Scrapy项目 到目前为止一切都进展顺利 然而 我对 Scrapy 的日志配置可能性并不满意 此刻 我已设定LOG FILE my spider log in the settings py我的项目 当我执行时scrapy
  • System.FormatException:在将字符串转换为十进制时,输入字符串的格式不正确。

    我在 ASP NET 和 C 方面遇到了一些问题 这是我的错误代码 mscorlib dll 中发生 System FormatException 类型的异常 但未在 gt 用户代码中处理 附加信息 输入字符串的格式不正确 protecte
  • 识别图表上升趋势或下降趋势

    我正在尝试读取数据并使用 python 标准线图 将它们绘制到图表上 有人可以建议我如何以编程方式对图表中的某些点是上升趋势还是下降趋势进行分类吗 哪种方法是实现这一目标的最佳方法 这肯定是一个已解决的问题 并且存在一个数学方程来识别这个问
  • 在Matlab中绘制多色线

    我想用两种颜色的破折号绘制一条垂直线 我更喜欢任何方向 但我现在只对垂直感到满意 比如红 蓝 红 蓝 我知道我可以这样做 plot 1 1 0 1 r hold on plot 1 1 0 1 b 但是 由于我需要能够移动线等 因此它应该只
  • 如何评估以素数为模的指数塔

    我想找到一种快速算法来评估如下所示的表达式 其中P是素数 A B C D E mod P Example 9 3 15 3 15 mod 65537 16134 问题是中间结果可能会变得太大而无法处理 基本上问题归结为计算a T mod m