【发布时间】:2020-11-05 21:59:29
【问题描述】:
前奏
我们要计算 modular exponentiation A(BC) mod p = ?,其中 A、B、C 和 @987654333 @ 是已知的,p 是一个基本数字。例如:243mod 23 = 6
如果我们直接计算的话,首先是BC = e,然后是Ae = n,最后是n mod p;我们将遇到为 e 和 n 创建(可能)非常大的中间结果的问题。例如:e = 43 = 64,n = 264 ≈ 1.845x1019,最后 n mod 23 = 6
但是,以直接的方式执行此操作,我们没有利用 p 是一个素数并且我们正在执行模幂运算这一事实。而且这样做,我们会遇到用计算机程序在 time (CPU) 和 space (memory) 方面计算结果的问题。
(是的,我们可以通过首先将 A(BC) mod p 减少为Ae mode p. 例如 A2 mod p = (A ⋅ A) mod p = [(A mod p) ⋅ (A mod p)] mod p –但这不是我们想要去的地方)。
聪明的方法——使用费马小定理
正如GeeksforGeeks 上的Find power of power under mod of a prime 和这个问题的起源 中所述,我们在A(BC) 中的指数BC mod p 可以使用Fermat's little theorem 以不同方式表示。
费马小定理指出:a(p - 1) ≡ 1 (mod p) 如果 p 是素数
导致以下转变:
-
可以重写指数 BC 为 x ⋅ (p - 1) + y
-
使用替代表达式,我们的 ABC 变为 Ax ⋅ (p - 1) + y = Ax ⋅ (p - 1) ⋅ Ay
-
使用费马小定理 Ax ⋅ (p - 1) = 1;计算 A(BC) mod p 变为计算 Ay
-
使用 BC = x ⋅ (p - 1) + y 那么 y 可以写成 BC mod (p - 1)
从上面我们得到 A(BC) mod p = (Ay) mod p
有了所有这些,我们可以分两步计算 A(BC) mod p,同时保持中间结果很小。
- y = (BC) mod (p - 1)
- 结果 = (Ay) mod p
例如:243mod 23
- y = 43 mod (23 - 1) = 64 mod 22 = 20
- 结果 = 220 mod 23 = 1048576 mod 23 = 6
问题
我的问题是关于上述转换的,我在任何地方都找不到(易于理解的)解释。也密切关注Fermat's little theorem 并没有帮助。可能这些转换应该是显而易见的,但我根本不清楚。
特别是,我不明白为什么指数 BC 可以表示为 x ⋅ (p - 1) + y。 – 这背后的原因是什么?
还有,为什么在使用Fermat's little theorem时要“明显”:
a(p - 1) ≡ 1 (mod p) 即 Ax ⋅ (p - 1) = 1?
如果有人能以易于理解的方式解释这些转换,那就太好了。
【问题讨论】:
-
这似乎是一道数学题,而不是编程题。
-
@Damien_The_Unbeliever 是的,我同意——这是一个数学理解问题。对我来说,这个问题是否是on-topic 并不明显。不过,这个问题是关于理解在尝试进行这种计算和解决(很可能)数字溢出时相关的软件算法。
-
如果这个问题在这里没有得到任何答案 - 您可能还想考虑在 Computer Science 或(可能是)Mathematics Stack Exchange 网站上提出您的问题。在任何情况下,请务必在发布之前查看他们各自的帮助页面(主题是什么,如何提问)。
-
当它回答您的问题时,不要忘记接受一个答案(勾选它旁边的复选标记)。这样,您的问题就不会再在搜索中显示为未回答了。
标签: algorithm optimization exponentiation mod theorem