小编典典

如何计算a ^^ b mod m?

algorithm

我必须为a,b,m <2 ^ 32的较大值有效地计算a ^^ b mod m,
其中^^是四元运算符:2 ^^ 4 = 2 ^(2 ^(2 ^ 2))

m不是质数,也不是10的幂。

你能帮我吗?


阅读 388

收藏
2020-07-28

共1个答案

小编典典

需要明确的是,a ^^ b与a ^ b不同,它是指数塔a ^(a ^(a ^ … ^ a)),其中有b个a的副本,也称为四元数。令T(a,b)= a
^^ b,因此T(a,1)= a且T(a,b)= a ^ T(a,b-1)。

要计算T(a,b)mod m = a ^ T(a,b-1)mod m,我们要计算具有极大指数的mod
m的幂。您可以使用的是模幂运算是周期前的,周期前长度最大为m的素数分解中质数的最大幂,最大为log_2
m,周期长度除以phi(m),其中phi(m)是Euler的totient函数。实际上,周期长度除以m的Carmichael函数
lambda(m)。所以,

a^k mod m = a^(k+phi(m)) mod m as long as k>log_2 m.

请注意,a不一定是相对于m的素数(或以后相对于phi(m),phi(phi(m))等)。如果是,则可以说a ^ k mod m = a ^(k mod
phi(m))mod m。但是,当a和m不是相对质数时,这并不总是正确的。例如,phi(100)= 40,2 ^ 1 mod 100 = 2,但2 ^ 41
mod 100 =52。您可以将大指数减少为mod phi(m)至少为log_2 m的全数,因此您可以说2 ^ 10001 mod 100 = 2 ^ 41
mod 100,但是您不能将其减少为2 ^ 1 mod100。您可以定义一个mod m [minimum x]或使用min +
mod(a-min,m)只要一个>分钟。

如果T(a,b-1)> [log_2 m],则

a^T(a,b-1) mod m = a^(T(a,b-1) mod phi(m) [minimum [log_2 m]])

否则,只需计算a ^ T(a,b-1)mod m。

递归计算。您可以用lambda(m)替换phi(m)。

计算2 ^ 32以下数字的素数分解不会花费很长时间,因为您最多可以确定2 ^ 16 =
65,536个试验分区中的素数。像phi和lambda这样的数论函数很容易用素因数分解表示。

在每个步骤中,您将需要能够以小指数计算模幂。

您最终需要计算幂mod phi(m),然后幂mod phi phi(phi(m)),然后幂mod phi
phi(phi(phi(phi(m)))),依此类推。在迭代phi之前不需要那么多迭代函数为1,这意味着您将所有内容都减少为0,并且不再通过增加塔的高度来进行任何更改。

这是一个示例,属于高中数学竞赛中的一种,在竞赛中,参赛者应重新发现并手动执行。14 ^^ 2016的后两位数字是多少?

14^^2016 mod 100 
= 14^T(14,2015) mod 100
= 14^(T(14,2015) mod lambda(100) [minimum 6]) mod 100
= 14^(T(14,2015 mod 20 [minimum 6]) mod 100

T(14,2015) mod 20 
= 14^T(14,2014) mod 20
= 14^(T(14,2014) mod 4 [minimum 4]) mod 20

T(14,2014) mod 4
= 14^T(14,2013) mod 4
= 14^(T(14,2013 mod 2 [minimum 2]) mod 4

T(14,2013) mod 2
= 14^T(14,2012) mod 2
= 14^(T(14,2012 mod 1 [minimum 1]) mod 2
= 14^(1) mod 2
= 14 mod 2
= 0

T(14,2014) mod 4 
= 14^(0 mod 2 [minimum 2]) mod 4
= 14^2 mod 4
= 0

T(14,2015) mod 20
= 14^(0 mod 4 [minimum 4]) mod 20 
= 14^4 mod 20
= 16

T(14,2016) mod 100
= 14^(16 mod 20 [minimum 6]) mod 100
= 14^16 mod 100
= 36

因此,14 ^ 14 ^ 14 ^ … ^ 14结尾于数字… 36。

2020-07-28