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/哥德巴赫猜想

results matching ""

    No results matching ""