我需要找到大功率的最后一位。当我得到简单的x ^ n时,我用以下方法解决了问题:pow(x,n,10)。但是当我有这样的示例时,该怎么办:103171 ^(14394 ^(221515 ^(441792 ^ 507709)))?我注意到特定数字的周期性,但这还不够。恐怕我缺少一些要点。
作为主函数last_digit的输入,我得到数字列表(lst),比如说[3,4,2]-这意味着我需要计算3 ^(4 ^ 2)。
我要通过大约630个测试,而我只能进行大约580个测试(其中大多数是随机生成的)。这是我尝试过的代码:
CYCLES = {
0 : [0, 0, 0, 0],
1 : [1, 1, 1, 1],
2 : [2, 4, 8, 6],
3 : [3, 9, 7, 1],
4 : [4, 6, 4, 6],
5 : [5, 5, 5, 5],
6 : [6, 6, 6, 6],
7 : [7, 9, 3, 1],
8 : [8, 4, 2, 6],
9 : [9, 1, 9, 1]
}
def power_rec(lst):
remainder = pow(lst[-2], lst[-1], 4)
if len(lst) == 2:
first_num = int(str(lst[0])[-1])
second_num = int(str(lst[1])[-1])
return CYCLES[first_num][second_num - 1]
lst = lst[:-2] + [ remainder ]
return power_rec(lst)
def last_digit(lst):
if len(lst) == 2:
return pow(lst[0], lst[1], 10)
if lst == []:
return 1
if len(lst) == 1:
return int(str(lst[0])[-1])
return power_rec(lst)
例如。我无法通过以下输入的测试:[555913、845991、261716、431426、571315、456986、461380、413475]或[2、2、101、2]。
我必须假设0 ^ 0 = 1,并且空列表的last_digit等于1。
我将不胜感激任何有用的提示。
更新。
找到最短的解决方案:
def last_digit(lst):
result = 1
for num in lst[::-1]:
result = pow(num, (result if result < 4 else result % 4 + 4) )
return result % 10
最佳答案
这是一个纯粹的数学问题...
任何数字的最后一位数字都是该模10的数字。因此,您要问当它们是一个很大的指数级数时,如何减少模10的数字。
为此,您可以重复应用Euler's Theorem。它说的(好,暗含)是要减少a ^ b模n,您可以减少b模phi(n)。
因此,要降低a ^ b模数10,可以先降低b模数phi(10)= 4。
在此,b的形式为c ^ d。要减少c ^ d模4,您可以从减少d模phi(4)= 2开始。这足以使这个问题容易解决。
让我们举个例子:
103171 ^(14394 ^(221515 ^(441792 ^ 507709)))模10
首先减少(221515 ^(blahblah))模2。这很明显是1,所以我们已经下降到:
103171 ^(14394 ^ 1)= 103171 ^ 14394模10
接下来,只需将14394模4减少为2。因此,我们得出以下结论:
103171 ^ 2模10
我想你可以从那里拿走。
(更新)
我忘记了欧拉定理仅在a(基数)和n(模数)没有共同因素时适用。哎呀
因此,当尝试减少14394 ^(blahblah)模4时,我们必须直接进行操作... 14394 ^(large power)实际上可以被4整除,因此它实际上是零,正确的答案是103171 ^ 0 = 1。 (虽然这是另一种方法,但只是运气。)
对于您评论中的示例(7 ^(6 ^ 21)),我们有一个类似的情况。 6 ^ 21为零(模4),因此答案为7 ^ 0 = 1。
12 ^(30 ^ 21)甚至更棘手,因为12和10不是相对质数。在这里,我们将需要计算值(mod 5)和(mod 2)并将两者结合起来。但是我开会迟到了,所以我现在不能完成这件事:-)
关于python - 求大功率的单位数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51428007/