Tăng phân vùng Goldbach


9

Giả thuyết Goldbach nói rằng:

mỗi số chẵn lớn hơn 2 là tổng của hai số nguyên tố.

Chúng tôi sẽ coi phân vùng Goldbach của số n là một cặp hai số nguyên tố thêm vào n . Chúng tôi quan tâm đến số lượng tăng phân vùng Goldbach . Chúng tôi đo kích thước của các phân vùng Goldbach của một số bằng kích thước của số nguyên tố nhỏ nhất trong tất cả các phân vùng của số đó. Một số là phân vùng tăng nếu kích thước này lớn hơn kích thước của tất cả các số chẵn nhỏ hơn.

Bài tập

Cho một số nguyên chẵn n> 2 , xác định xem n có tăng phân vùng Goldbach hay không và xuất ra hai giá trị duy nhất, một nếu nó là và một nếu không.

Đây là , vì vậy bạn nên cố gắng giảm thiểu số lượng byte trong mã nguồn của mình.

OEIS A025018



Đó là một câu hỏi hay, đó là điều khó hiểu. Tôi chỉnh sửa nó để đơn giản hóa từ ngữ. Vui lòng kiểm tra nó, và nếu tất cả là chính xác áp dụng thay đổi.
Евгений Новиков

1
@ ВгенийiTовиков Tôi thấy bản chỉnh sửa của bạn khó hiểu hơn bản gốc. Tôi đã từ chối nó. Có lẽ chúng ta có thể thảo luận một cách để làm cho điều này rõ ràng hơn ở đây .
Ad Hoc Garf Hunter

Các ví dụ hoạt động vẫn còn rất khó hiểu - chúng dường như kéo các con số ra khỏi hư không, và mỗi phép so sánh được thể hiện khác nhau mà không giải thích lý do tại sao một số số được sử dụng. Nếu bạn đã biết câu trả lời, bạn có thể tìm ra nó. . . mà tôi đã làm bằng cách quay lại đoạn đầu tiên, bỏ qua các ví dụ cho đến khi rõ ràng, sau đó tìm ra cách các ví dụ được xây dựng. Có lẽ một số cấu trúc bảng sẽ có ích, bao gồm 10 có thể sẽ giúp
Neil Slater

@NeilSlater Cảm ơn bạn đã phản hồi. Tôi đã loại bỏ hoàn toàn các ví dụ vì tôi nghĩ rằng chúng gây hại nhiều hơn là tốt. Tôi nghĩ rằng thách thức là rõ ràng từ lời giải thích, và các ví dụ chỉ làm phức tạp mọi thứ. Nếu lời giải thích không đủ, tôi sẽ rất vui khi mở rộng hoặc làm rõ về điều đó, tuy nhiên tôi không nghĩ rằng tôi sẽ thêm các ví dụ trở lại bởi vì chúng dường như là nguồn gây nhầm lẫn lớn nhất cho đến nay.
Ad Hoc Garf Hunter

Câu trả lời:


5

Thạch , 12 byte

ÆRðfạṂ
Ç€M⁼W

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Ç€M⁼W   Main link. Argument: n

Ç€      Map the helper link over [1, ..., n].
  M     Get all indices of the maximum.
    W   Wrap; yield [n].
   ⁼    Test the results to both sides for equality.


ÆRðfạṂ  Helper link. Argument: k

ÆR      Prime range; get all primes in R := [1, ..., k].
  ð     Begin a dyadic chain with arguments R and k.
    ạ   Absolute difference; yield k-p for each p in R.
   f    Filter; keep the q in R such that q = k-p for some p in R.
     Ṃ  Take the minimum.
        This yields 0 if the array is empty.

4

PHP , 154 byte

for(;$n++<$a=$argn;$i-1?:$p[]=$n)for($i=$n;--$i&&$n%$i;);foreach($p as$x)foreach($p as$y)if(!$r[$z=$x+$y]){$r[$z]=$x;$l[]=$z<$a?$x:0;};echo$r[$a]>max($l);

Hãy thử trực tuyến!

Mở rộng

for(;$n++<$a=$argn;$i-1?:$p[]=$n) # loop through all integers till input if is prime add to array 
  for($i=$n;--$i&&$n%$i;);
foreach($p as$x) #loop through prime array
  foreach($p as$y) #loop through prime array 
    if(!$r[$z=$x+$y]){
      $r[$z]=$x; # add only one time lower value for a sum of $x+$y 
      $l[]=$z<$a?$x:0;}; # add lower value if sum is lower then input
echo$r[$a]>max($l); # Output 1 if lower value for sum of input is greater then all lower values of all numbers under input

Hãy thử trực tuyến! Kiểm tra tất cả các số cho đến 1000


3

JavaScript (ES6), 135 byte

Sử dụng một logic tương tự như câu trả lời PHP của Jörg .

(n,P=[...Array(n).keys()].filter(n=>(p=n=>n%--x?p(n):x==1)(x=n)))=>P.map(p=>P.map(q=>a[q+=p]=a[q]||(m=q<n&&p>m?p:m,p)),a=[m=0])&&a[n]>m

Bản giới thiệu


2

Python 3: 156 151 142 138 136 128 byte

r=range
m=lambda n:min(x for x in r(2,n+1)if all(o%i for o in[x,n-x]for i in r(2,o)))
f=lambda n:m(n)>max(map(m,r(2,n,2)))or n<5

(cảm ơn OP)

(cảm ơn @Rod) (một lần nữa) (và một lần nữa)


@Olmman bạn có thích nó không?
enedil

@Rod vì maxvới phần tử trả về khóa có giá trị tối đa sau khi áp dụng khóa, tôi đã phải thêm ứng dụng chức năng nhưng dù sao nó cũng ngắn hơn.
enedil

@Rod và tôi không thể lấy đề xuất của bạn rangenbị ràng buộc bên trong lambda.
enedil

@enedil Thật vậy, nhưng với mức tối đa, bạn có thể sử dụngmax(map(m,r[::2]))
Rod

1
Bạn không cần đặt tên fvà do đó có thể lưu 2 byte bằng cách xóa f=.
Ad Hoc Garf Hunter

1

Python 3: 204 196 byte

Byte được lưu nhờ: Olm Man

from itertools import*
m=lambda g:min([x for x in product([n for n in range(2,g)if all(n%i for i in range(2,n))],repeat=2)if sum(x)==g][0])
i=lambda g:1if all(m(g)>m(x)for x in range(4,g,2))else 0

Hãy thử trực tuyến!


2
Một vài mẹo, hầu hết các hàm dựng sẵn thích minallcó thể lấy các trình tạo làm đối số, điều này có nghĩa là min([...])có thể rút ngắn min(...)và tương tự với tất cả. Bạn cũng có thể thoát khỏi một số không gian, đặc biệt là không gian trong import *và bất kỳ không gian nào sau khi niềng răng, tôi thấy bạn có một sau range(g)và một trước [i for i in ..., không cần thiết.
Ad Hoc Garf Hunter

^ Thật tuyệt vời, tôi không biết điều đó
bẻ cong

Ngoài ra, bạn có thể thực hiện kiểm tra chính của mình ngắn hơn một chút bằng cách thay đổi thành all(n%i for i in range(2,g)), nhưng bạn phải đổi range(g)thành range(1,g)vì điều này mang lại kết quả dương tính giả vào ngày 1.
Ad Hoc Garf Hunter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.