lambda n:sum((n+n%6-3)*n%k<1for k in range(2,4*n))==2
在网上试试!
背景
所有整数都采用以下形式之一,整数k: 6k - 3,6k - 2,6k - 1,6k,6k + 1,6k + 2。
由于6k -2、6k和6k +2都是偶数,由于6k -3是可被3除的,所以除2和3以外的所有素数都必须是6k - 1或6k +1形式。由于孪生素数对的差是2,除(3,5)外,所有孪生素数对都是形式(6k - 1,6k + 1)。
设n为6k±1形式。
- 如果n=6k-1,则n+n%6-3=6k-1+(6k-1)%6-3=6k-1+5-3= 6k + 1.
- 如果n= 6k + 1,则n+n%6-3= 6k + 1 + (6k +1)%6-3= 6k +1+1-3=6k-1。
因此,如果n是孪生素对的一部分,并且n≠3,则它的孪生子是n+ n%6 - 3。
是如何工作的
Python没有内置的原始性测试。虽然有一些简短的方法来测试单个数字的原始性,但是对两个数字进行测试将是很长的时间。我们要和区长合作。
sum((n+n%6-3)*n%k<1for k in range(2,4*n))
计算区间[2,4n)除以(n + n%6 - 3)n中的整数k数,即计算区间[2,4N]中(n + n%6 - 3)n的除数。我们声称这个计数是2当且仅当n是孪生素对的一部分。
- 如果n=3(一个孪生素数),(n +n%6-3)n= 3(3 +3-3)=9在[2,12]中有两个除数(3和9)。
- 如果n>3是孪生素数,则m := n+ n%6 -3是它的孪生体.在这种情况下,mn正好有四个除数: 1,m,n,mn。由于n> 3,我们有m> 4,所以4n < mn,正好有两个除数(m和n)落入区间[2,4N]。
- 如果n=1时,则(n +n%6-3)n= 1 +1-3= -1在[2,4]中没有除数。
- 如果n=2时,则(n +n%6-3)n= 2(2 +2-3)=2在[2,8]中有一个除数(本身)。
- 如果n= 4,则(n +n%6-3)n= 4(4 +4-3)= 20在[2,16]中有4个除数(2,4,5,10)。
- 如果n> 4是偶数,2,n/2,n都除以n,因此n+ n%6 - 3)n,自n>4我们就有n/2 >2,所以在[2,4N]中至少有三个除数。
- 如果n= 9,则(n +n%6-3)n= 9(9 +3-3)= 81在[2,36]中有三个除数(3,9,21)。
- 如果n> 9是3的倍数,则3,n/3,n都除以n,因此,(n +n%6-3)n,自n>9以来,n/3 > 3,因此在[2,4N]中至少有三个除数。
- 最后,如果n= 6k±1 >4不是孪生素数,则无论n还是m := n+ n%6 -3都必须是复合的,因此允许适当的除数d >1。由于n=m+2或m=n+2和n,m> 4,所以整数d、m和n是mn的不同的除数。此外,m1时,mn在[2,4N]中至少有三个因子。