寻找大功率的单位数字

时间:2018-07-19 16:45:59

标签: python python-3.x math

我需要找到大功率的最后一位。当我得到简单的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

1 个答案:

答案 0 :(得分:3)

这是一个纯粹的数学问题...

任何数字的最后一位数字都是该模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 ^(大功率)实际上可以被4整除,因此实际上是并且正确的答案是103171 ^ 0 = 1(另一种方法也给出了,但只是靠运气。)

对于您注释中的示例(7 ^(6 ^ 21)),我们有一个类似的情况。 6 ^ 21为零(模4),因此答案为7 ^ 0 = 1。

12 ^(30 ^ 21)甚至更棘手,因为12和10不是相对质数。在这里,我们将需要计算值(mod 5)和(mod 2)并将两者结合起来。但是我开会迟到了,所以我现在不能结束:-)