检查无限级数是否可以被数字整除?

时间:2019-01-05 12:28:22

标签: python-3.x

我们将获得无限级数的前三个数字,而该级数的下一个元素将由以下公式决定:

Tn= Tn-1 + Tn-2 + Tn-3

如果给我们前三个数字分别为1、1、1,则该序列将如下所示:

1, 1, 1, 3, 5, 9, 17, 31, . . . . 

现在,我想问一下如何检查该系列的所有元素是否可以被一个数字整除的逻辑。例如,我们知道上面的序列不能被27整除。 预先感谢!

1 个答案:

答案 0 :(得分:0)

我们的问题与三阶线性递归或Tribonacci numbers的模量有关。

我们无法检查整个无限级数,但是通过取每个项的模数,如果级数中的一项是可整除的,我们将得到模0。

Sequence: 1, 1, 1, 3, 5, 9, 17, 31, 57, 105
Modulo 7: 1, 1, 1, 3, 5, 2,  3,  3,  1,   0

我们不在乎序列的项,只在乎它们的模数。此外,由于模运算符是分布式(almost),我们可以将序列修改为Tn= ( Tn-1 + Tn-2 + Tn-3 ) mod X,其中X是我们正在测试的除数。

我们现在有一组有限的数字的无限序列。每个术语都必须介于0X-1之间(含),这意味着每个三元组最多有X^3个可能性。如果X不能被任何项整除,则该序列必须最终重复,返回到1, 1, 1

T0 = 1, T1 = 1, T2 = 1开始,我们发现T117 mod 27 = 1, T118 mod 27 = 1, T119 mod 27 = 1

鉴于所有这些,我们可以编写一个将终止的程序。

def isDivisible(x):
    # We'll pre-compute the 3rd term of the sequence
    l = [1,1,3]
    # We will compute the modulus of the sequence
    #     until we generate a 0,
    #     or we repeat to 1,1,1
    while (l[2] > 0 and l[0]*l[1]*l[2]!=1):
        l = [l[1], l[2], sum(l) % x]
    #if we generated a 0, x is divisible
    return l[2]==0

print(isDivisible(7))
print(isDivisible(27))

另请参阅Project Euler solution