对于a,b,m <2 ^ 32的大值,我必须有效地计算^^ b mod m
其中^^是tetration运算符:2 ^^ 4 = 2 ^(2 ^(2 ^ 2))
m不是素数而不是10的幂。
你能帮忙吗?
答案 0 :(得分:11)
要清楚,^^ b与^ b不同,它是指数塔a ^(a ^(a ^ ... ^ a))其中有b个副本,也是称为tetration。设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的幂。你可以使用的是模幂运算是预周期的,前期长度最多是素数因子分解中的素数的最大幂,最多为log_2 m,周期长度除以phi(m),其中phi(m)是Euler's totient function。实际上,周期长度除以m,lambda(m)的Carmichael's function。所以,
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.你可以将大指数减少到至少log_2 m的全等数mod phi(m),所以你可以说2 ^ 10001 mod 100 = 2 ^ 41 mod 100但你不能将它减少到2 ^ 1 mod 100.你可以定义mod m [最小x]或使用min + mod(a-min, m)只要a> min。
如果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]])
否则只计算^ T(a,b-1)mod m。
递归计算。您可以用lambda(m)替换phi(m)。
计算2 ^ 32以下数的素数因子化并不需要很长时间,因为您可以确定最多2 ^ 16 = 65,536个试验区的素数因子。像phi和lambda这样的数论函数很容易用素因子化表示。
在每一步中,您都需要能够使用小指数计算模块化功率。
你最终计算权力mod phi(m),然后为mod phi(phi(m))提供权力,然后为mod 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。