我需要解决任务,有一个条件:有一个由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))
但没有序列。也许我做错了。
我会试着用一种不那么暴力的方法解决这个问题。
有些想法先试验。其他每个数字都有2个共同点。对于剩余的8或9,您需要更多因素。因此,例如,你可以将其中一些因子共同使用。然后是另一个因素,例如:
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满足这些约束:
(使用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
特点是
这是更大的,所以2184 ... 2200是满足您要求的第一个序列:
哪个应该在你的循环范围内。实际上它应该足够循环到30030,素数的乘积高达17。所以如果你的循环真的完成了,但错过了这个序列,那么某处肯定会有一个错误,并且知道序列可能会帮助你调试那个。