Python:查找数字序列

时间:2018-06-19 11:44:33

标签: python math

我需要解决任务,有一个条件: 由N开始的序列有17个连续自然数。对于此序列中的任何数字a,该序列中还有另一个数字b,例如GCD (a, b)> 1。找到满足此条件的最小N。

我使用此代码

for i in range(2, 100000000):
    not_division = 0
    lst = list(range(i, i+17))
    #print(lst)
    for j in lst:
        counter = 0
        for k in lst[1:]:
            if gcd_iterative(j, k) > 1 and gcd_iterative(j, k) != k:
                counter += 1

        if counter == 0:
            not_division += 1
            #print('%s have no delimiter' % j)
    if not_division == 0:
        print('%s SUCCESS' % str(lst))

但是没有序列。 也许我做错了。

1 个答案:

答案 0 :(得分:3)

我会尝试使用一种不太暴力的方法来解决这个问题。

首先进行一些思想实验。每隔一个数字将具有共同的因子2。对于其余的8或9,您需要更多的因素。因此,例如,您可能对其中某些因素有3的共同系数。然后是另一个因素,依此类推,例如:

2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2
* 3 * * 3 * * 3 * * 3 * * 3 * * 3
* * * 5 * * * * 5 * * * * 5 * * *
          ^       ^   ^       ^

因此,现在以更系统的方式进行此操作。考虑所有小于17的素因。尝试这些素的每种组合,并为每种组合尝试每个可能的偏移量(但仅在序列中至少出现2个那些)。看看其中哪一个导致每个人至少都有一个伴侣的情况。然后使用Chinese remainder theorem找到相应的序列。

实际上只有2个候选人:

 2  *  2  *  2  *  2  *  2  *  2  *  2  *  2  *  2
 3  *  *  3  *  *  3  *  *  3  *  *  3  *  *  3  *
 *  5  *  *  *  *  5  *  *  *  *  5  *  *  *  *  5
 7  *  *  *  *  *  *  7  *  *  *  *  *  *  7  *  *
 *  *  *  *  * 11  *  *  *  *  *  *  *  *  *  * 11
13  *  *  *  *  *  *  *  *  *  *  *  * 13  *  *  *

,其特征在于满足以下约束的第一个数字 x

  • x mod 2 = 0
  • x mod 3 = 0
  • x mod 5 = 4
  • x mod 7 = 0
  • x mod 11 = 6
  • x mod 13 = 0
  • x mod 30030 = 2184

(使用Sage函数crt计算)和上面的镜像

 2  *  2  *  2  *  2  *  2  *  2  *  2  *  2  *  2
 *  3  *  *  3  *  *  3  *  *  3  *  *  3  *  *  3
 5  *  *  *  *  5  *  *  *  *  5  *  *  *  *  5  *
 *  *  7  *  *  *  *  *  *  7  *  *  *  *  *  *  7
11  *  *  *  *  *  *  *  *  *  * 11  *  *  *  *  *
 *  *  * 13  *  *  *  *  *  *  *  *  *  *  *  * 13

特征在于

  • y mod 2 = 0
  • y mod 3 = 1
  • y mod 5 = 0
  • y mod 7 = 5
  • y mod 11 = 0
  • y mod 13 = 10
  • y mod 30030 = 7810

更大,所以2184…2200是满足您要求的第一个序列:

  • 2184 = 2 3 ×3×7×13
  • 2185 = 5×19×23
  • 2186 = 2××1093
  • 2187 = 3 7
  • 2188 = 2 2 ×547
  • 2189 = 11×199
  • 2190 = 2×3×5×73
  • 2191 = 7××313
  • 2192 = 2 4 ×137
  • 2193 = 3××17××43
  • 2194 = 2××1097
  • 2195 = 5×439
  • 2196 = 2 2 ×3 2 ×61
  • 2197 = 13 3
  • 2198 = 2×7×157
  • 2199 = 3××733
  • 2200 = 2 3 ×5 2 ×11

应该在您的循环范围内。实际上,它最多可以循环到30030,即质数的乘积最多为17。因此,如果您的循环确实完成了,但是错过了此序列,那么在某处一定有一个错误,知道序列可以帮助您调试