戈德巴赫分区


18

哥德巴赫猜想指出,每个大于2的偶数都可以表示为两个素数之和。例如,

4 = 2 + 2
6 = 3 + 3
8 = 5 + 3

但是,一旦达到10,就会发生一些有趣的事情。不仅可以写成10

5 + 5

但也可以写成

7 + 3

因为10可以表示为两个方法的两个素数之和,所以我们说10的“哥德巴赫分区”是2。或更笼统地说,

数字的戈德巴赫分区是不同的书写方式的总数,n = p + q其中pq是素数,p >= q

您面临的挑战是编写一个找到数字的Goldbach分区的程序或函数。现在,从技术上讲,术语“戈德巴赫分区”仅用于表示偶数。然而,由于奇数整数P + 2可以可以表示为两个素数的总和如果P> 2为素数,我们将这个扩展到所有正整数(A061358)。

您可以放心地假设您的输入将始终为正整数,并且可以使用我们默认的任何允许方法进行输入和输出,例如函数参数和返回值,STDIN和STDOUT,读取和写入文件等。

最多100个正整数的Goldbach分区为:

0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 2, 1, 2, 0, 2, 1, 2, 1, 3, 0, 3, 1,
3, 0, 2, 0, 3, 1, 2, 1, 4, 0, 4, 0, 2, 1, 3, 0, 4, 1, 3, 1, 4, 0, 5, 1, 4,
0, 3, 0, 5, 1, 3, 0, 4, 0, 6, 1, 3, 1, 5, 0, 6, 0, 2, 1, 5, 0, 6, 1, 5, 1,
5, 0, 7, 0, 4, 1, 5, 0, 8, 1, 5, 0, 4, 0, 9, 1, 4, 0, 5, 0, 7, 0, 3, 1, 6

像往常一样,存在标准漏洞,而最短答案以字节为单位!


1
您总是会遇到如此艰巨的挑战:-)
路易斯·门多

Answers:


6

果冻,8 字节

_ÆRÆPSHĊ

在线尝试!验证所有测试用例

怎么运行的

_ÆRÆPSHĊ  Main link. Argument: n (positive integer)

 ÆR       Prime range; yield [2, 3, 5, ..., n].
_         Subtract all primes in this range from n.
   ÆP     Compute the primality of the resulting differences.
          This returns 1 for each prime p such that n - p is also prime.
     S    Compute the sum of the resulting Booleans.
      H   Divide it by 2, since [p, n - p] and [n - p, p] have both been counted.
       Ċ  Ceil; round the resulting quotient up (needed if n = 2p).

哦好多了:D
Jonathan Allan

5

Python 2,76个字节

g=lambda n,k=2:n/k/2and all(x%i for x in[k,n-k]for i in range(2,x))+g(n,k+1)

从递归地爬升k=2n/2,将kn-k都作为素数的值相加。这将是很好算n的同时不降反升,但这有一个那样的问题k=0k=1被错误地称为素数:

g=lambda n,k=0:n/k and all(x%i for x in[k,n]for i in range(2,x))+g(n-1,k+1)

素数检查是按试验划分的,通过同时检查kn-k一起检查来缩短。我发现这比使用威尔逊定理生成器(79字节)要短:

f=lambda n,k=1,P=1,l=[]:n/k and P%k*(n-k in l+P%k*[k])+f(n,k+1,P*k*k,l+P%k*[k])

这个想法的目的是在到达上半部分之前保留下半部分中所有质数的列表,但是对于中点k=n/2n-k当我们到达上半部分时,我们没有时间将其添加到列表中k。迭代版本可以解决此问题,但是它是82个字节:

n=input()
s=P=k=1;l=[]
while k<n:l+=P%k*[k];s+=P%k*(n-k in l);P*=k*k;k+=1
print~-s

5

MATL,8字节

tZq&+=Rz

在线尝试!

说明

以输入8为例

      % Take input implicitly
t     % Duplicate
      % STACK: 8, 8
Zq    % All primes up to that number
      % STACK: 8, [2 3 5 7]
&+    % Matrix with all pairwise additions
      % STACK: 8, [4  5  7  9
                   5  6  8 10
                   7  8 10 12
                   9 10 12 14]
=     % True for entries that equal the input
      % STACK: [0 0 0 0
                0 0 1 0
                0 1 0 0
                0 0 0 0]
R     % Extract upper triangular part (including diagonal). 
      % This removes pairs that are equal up to order
      % STACK: [0 0 0 0
                0 0 1 0
                0 0 0 0
                0 0 0 0]
z     % Number of nonzero entries
      % STACK: 1
      % Display implicitly

使用稍微修改后的代码版本来观察序列图很有趣:

:"@       % Input n implicitly. For each k from 1 to n, push k
tZq&+=Rz  % Same code as above. Pushes the result for each k
]v'.'&XG  % End. Concatenate all results into a vector. Plot as dots

输入10000结果为

在此处输入图片说明

您可以在MATL Online上尝试(如果按下时“运行”按钮未更改为“杀死”,请刷新页面)。生成输入图需​​要花费大约25秒钟的时间3000;几千个以上的输入将超时。


1
这个Upper triangular part把戏真是太酷了!
DJMcMayhem

3

JavaScript(ES6),77 73 70字节

@Arnauld节省了3个字节

f=(n,x=n)=>--x<2||n%x&&f(n,x)
g=(a,b=a>>1)=>b>1?f(b)*f(a-b)+g(a,b-1):0

f是素数测试函数;相关功能是g

f通过从n-1递归递减来工作; 每个阶段的控制流程如下:

  • x<2||如果x <2,则该数字为质数。返回1
  • n%x&&否则,如果n mod x = 0,则该数字不是素数;归还n%x
  • f(n,x-1)否则,数字可能不是素数;递减x,然后重试。

g尽管没有太多控制流,但它以类似的方式工作。对于[2,floor(a / 2)]范围内的每个整数b,通过将f(b)乘以f(ab)进行工作,然后对结果求和。这使我们对数那笔一个,其中在对两个数字都是素数,这是我们想要的东西。


由于a是肯定的,b=a>>1应该为您节省一个字节。
阿纳尔德

@Arnauld谢谢!我应该记得>>运营商...
ETHproductions '16

关于素数测试功能,您可以f=(n,x=n)=>--x<2||n%x&&f(n,x)吗?
Arnauld

@Arnauld那是个天才,谢谢:)
ETHproductions '16

2

05AB1E10 8字节

效率极低。

D!f-pO;î

在线尝试!尝试一种效率较低的生成质数的方法

说明

n = 10 用作示例。

D          # duplicate
           # STACK: 10, 10 
 !         # factorial
           # STACK: 10, 3628800
  f        # unique prime factors
           # STACK: 10, [2,3,5,7]
   -       # subtract
           # STACK: [8,7,5,3]
    p      # is prime
           # STACK: [0,1,1,1]
     O     # sum
           # STACK: 3
      ;    # divide by 2
           # STACK: 1.5
       î   # round up
           # STACK: 2
           # implicit output

您不能使用它ü吗?喜欢D!fü+r¢吗?
魔术章鱼缸

1
@carusocomputing:我不知道那将如何工作。例如n=10,将count(10,[5,8,12])设为0(而不是2)ü仅应用于每对项目之间。它给了我一个尝试的想法ã,但是不幸的是结果却增加了1个字节。
Emigna

2

GAP,57位元组

n->Number([2..QuoInt(n,2)],k->IsPrime(k)and IsPrime(n-k))

我认为GAP没有比这明显的方法更短的方法了。Number计算列表中有多少个元素满足谓词。

使用它来计算前100个值:

gap> List([1..100],n->Number([2..QuoInt(n,2)],k->IsPrime(k)and IsPrime(n-k)));
[ 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 2, 1, 2, 0, 2, 1, 2, 1, 3, 0, 3, 1, 
  3, 0, 2, 0, 3, 1, 2, 1, 4, 0, 4, 0, 2, 1, 3, 0, 4, 1, 3, 1, 4, 0, 5, 1, 4, 
  0, 3, 0, 5, 1, 3, 0, 4, 0, 6, 1, 3, 1, 5, 0, 6, 0, 2, 1, 5, 0, 6, 1, 5, 1, 
  5, 0, 7, 0, 4, 1, 5, 0, 8, 1, 5, 0, 4, 0, 9, 1, 4, 0, 5, 0, 7, 0, 3, 1, 6 ]

2

Brachylog,22个字节

:{,A:B>=.:#pa+?,.=}fl

在线尝试!

说明

问题的直接记载。

:{                }f       Find all valid outputs of the predicate in brackets for the Input
                    l      Output is the number of valid outputs found

  ,A:B>=.                  Output = [A, B] with A >= B
         :#pa              Both A and B must be prime numbers
             +?,           The sum of A and B is the Input
                .=         Label A and B as integers that verify those constraints

2

Mathematica,52个字节

Count[IntegerPartitions[#,{2}]//PrimeQ,{True,True}]&

结果作为匿名函数提供。尝试在其上绘制图形:

DiscretePlot[
 Count[IntegerPartitions[#, {2}] // PrimeQ, {True, True}] &[i], {i, 1,
   1000}]

序列图

顺便说一下,该代码的长度与OEIS上的演示代码的功能版本相同。


2
49个字节:PrimeQ[#~IntegerPartitions~{2}]~Count~{a=True,a}&
LegionMammal978 '16

1

果冻,12 字节

HRð,_@ÆPð×/S

在线试用
1-100

怎么样?

HRð,_@ÆPð×/S - Main link: n    e.g. 22
H            - halve
 R           - range          [1,2,3,4,5,6,7,8,9,10,11] (note this will be 1 to n//2)
  ð          - dyadic chain separation
   ,         - pair with
    _@       - n -           [[1,2,3,4,5,6,7,8,9,10,11],[21,20,19,18,17,16,15,14,13,12,11]]
      ÆP     - is prime? (1 if prime 0 if not)
                            [[0,1,1,0,1,0,1,0,0,0,1],[0,0,1,0,1,0,0,0,1,0,1]]
        ð    - dyadic chain separation
         ×/  - reduce with multiplication
                             [0,0,1,0,1,0,0,0,0,0,1]
           S - sum           3

1

球拍219字节

(let*((pl(for/list((i n) #:when(prime? i))i))(ll(combinations(append pl pl)2))(ol'()))(for/list((i ll))(define tl(sort i >))
(when(and(= n(apply + i))(not(ormap(λ(x)(equal? x tl))ol)))(set! ol(cons tl ol))))(length ol))

取消高尔夫:

(define(f n)
 (let* ((pl                                   ; create a list of primes till n
          (for/list ((i n) #:when (prime? i))
            i))
         (ll (combinations (append pl pl) 2)) ; get a list of combinations of 2 primes
         (ol '()))                            ; initialize output list
    (for/list ((i ll))                        ; test each combination
      (define tl (sort i >))
      (when (and (= n (apply + i))            ; sum is n
                 (not(ormap (lambda(x)(equal? x tl)) ol))) ; not already in list
        (set! ol (cons tl ol))))              ; if ok, add to list
    (println ol)                              ; print list
    (length ol)))                             ; print length of list

测试:

(f 10)
(f 100)

输出:

'((5 5) (7 3))
2
'((97 3) (89 11) (83 17) (71 29) (59 41) (53 47))
6

1

实际上,11个字节

;R`p`░@-♂bΣ

在线尝试!

说明:

;R`p`░@-♂bΣ
 R`p`░       prime values in [1, n]
;     @-     subtract each value from n
        ♂b   convert each value to boolean
          Σ  sum

1

05AB1E,6个字节

;ÅP-pO

在线尝试!

说明:

                  # implicit input (example: 10)
;                 # divide input by 2 (5)
 ÅP               # primes up to that ([2, 3, 5])
   -              # subtract from the implict input ([8, 7, 5])
    p             # isPrime? ([0, 1, 1])
     O            # sum (2), implicit output

0

Haskell,73个字节

f n|r<-[a|a<-[2..n],all((<2).gcd a)[2..a-1]]=sum[1|p<-r,q<-r,q<=p,p+q==n]

用法示例:map f [1..25]-> [0,0,0,1,1,1,1,1,1,2,0,1,1,2,1,2,0,2,1,2,1,3,0,3,1]

直接执行定义的:首先绑定r的所有质数到输入号码n,然后采取1所有pq来自r何处q<=p,并p+q==n和它们求和。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.