P205: Goldbach's conjecture
哥德巴赫猜想。哥德巴赫猜想(Goldbach's conjecture)是数论中存在最久的未解问题之一。这个猜想最早出现在1742年普鲁士人克里斯蒂安·哥德巴赫与瑞士数学家莱昂哈德·欧拉的通信中。用现代的数学语言,哥德巴赫猜想可以陈述为:wiki-goldbach
任一大于2的偶数,都可表示成两个质数之和。
这个猜想与当时欧洲数论学家讨论的整数分拆问题有一定联系。整数分拆问题是一类讨论「是否能将整数分拆为某些拥有特定性质的数的和」的问题,比如能否将所有整数都分拆为若干个完全平方数之和,或者若干个完全立方数的和等。而将一个给定的偶数分拆成两个质数之和,则被称之为此数的哥德巴赫分拆。wiki-goldbach
现在给定一个大于2的偶数,求两个质数,其和是该偶数。照例先写测试用例:
from python99.arithmetic.p205 import goldbach
def test_goldbach():
assert goldbach(28) == [5, 23]
assert goldbach(36) == [5, 31]
assert goldbach(38) == [7, 31]
assert goldbach(48) == [5, 43]
assert goldbach(64) == [3, 61]
假设,是偶数且,和是个质数且。因为和的和是,所中和中必有一个不大于,而另一个必不小于,这裹就以。则。我们遍历2至之间所有的质数,如果减该质数后的差也为质数,则该质数和差即为一个符合约束的分拆数组合。
代码实现:
# Goldbach's conjecture
from python99.arithmetic.p201 import is_prime
from python99.arithmetic.p204 import prime_generator
def goldbach(n):
for first_prime in prime_generator(2, n//2):
if is_prime(n-first_prime):
return [first_prime, n-first_prime]
return []
这裹使用「生成器(generator)」构造2与之间的质数。因为本题祇要求得出一个可行解,所以不一定要遍历所有可能。在本例中,生成器比列表更适用。
参考文献
wiki-goldbach. https://zh.wikipedia.org/wiki/哥德巴赫猜想 ↩