Здогадка Гольдбаха


15

Напишіть програму, яка пропонує користувачеві парне число, що перевищує 2.

Враховуючи припущення Гольдбаха про те, що кожне парне число, що перевищує 2, може бути виражене сумою двох простих чисел, виведіть два простих числа, які при складанні разом забезпечують потрібне парне число. Редагувати: програма повинна надрукувати лише ПАРІ праймів, не всі. Наприклад:

4: 2 + 2

6: 3 + 3

8: 3 + 5

10: 5 + 5 або 3 + 7


"тільки має надрукувати пару простих ліній" Чи означає це, що нам дозволяється друкувати більше пар?
Айко

Я гадаю, якщо це скоротить довжину вашого коду, але це має бути організовано
Раціональність

Відповіді:


11

APL, 34 або 44 байти

Перша версія має тривалість 34 символів і обмежується символами з оригінальних однобайтових діаграм APL, таких як, як і раніше підтримується в Dyalog APL:

↑c/⍨n=+/¨c←,∘.,⍨v/⍨~v∊v∘.×v←1↓⍳n←⎕

Пояснення:

                               n←⎕   ⍝ ask for a number, store as n
                          v←1↓⍳n     ⍝ generate all integers from 2 to n
                      v∘.×v          ⍝ compute the product table of any two such integers
                v/⍨~v∊               ⍝ select those that don't appear in the product table 
         c←,∘.,⍨                     ⍝ generate all possible pairs of these primes
    n=+/¨c                           ⍝ check which pairs have a sum equal to n
↑c/⍨                                 ⍝ take the first that does

Друга версія має лише 22 символи, оскільки вона використовує πфункцію для перевірки наявності простих чисел, але вона доступна лише в NARS2000, який використовує Unicode, тому кількість байтів 44 в UCS-2:

2⍴(⌿⍨{∧/0π⍵})(⍪,⌽)⍳⎕-1

Пояснення:

                   ⎕    ⍝ ask for a number N
                  ⍳ -1  ⍝ generate all naturals from 1 to N-1
             (⍪,⌽)      ⍝ arrange it into a table of all pairs of naturals with sum N
     {∧/0π⍵}            ⍝ check which pairs are made of all primes
2⍴(⌿⍨       )           ⍝ return the first pair that does

Приклади

(⎕: запит на запит про номер)

      2⍴(⌿⍨{∧/0π⍵})(⍪,⌽)⍳⎕-1
⎕:
      4
2 2
      2⍴(⌿⍨{∧/0π⍵})(⍪,⌽)⍳⎕-1
⎕:
      6
3 3
      2⍴(⌿⍨{∧/0π⍵})(⍪,⌽)⍳⎕-1
⎕:
      8
3 5
      2⍴(⌿⍨{∧/0π⍵})(⍪,⌽)⍳⎕-1
⎕:
      124
11 113

Працює ¯2π⍳2πnяк основний генератор?
Оберон

@Oberon що саме робить πоператор?
примо

Діадичні πперемикачі з : ¯2πxобчислює x-просте, ¯1πxє першим простим, меншим від x, 0πxтестує x на первинність, 1πxперше просте більше, ніж x, 2πxчисельність простих чисел менше x, 10πxкількість дільників x, 11πxце сума всіх дільників x 12πxі 13πxє функцією Мебіуса і Тотієнта відповідно. І останнє, але не менш важливе значення, монадика πxповертає основну факторизацію x.
Оберон

@Oberon, специфічний для NARS2000, чи не так? Здається, цікавий перекладач. Я спробую це і переглянути свою відповідь.
Тобія

@Tobia Це? Вибачте тоді. Я бачив, як десь посилався, але вони ніколи не згадували про NARS2000. Добре знати.
Оберон

6

Python 2, 75 71 байт

n=input();k=m=1;p={0}
while{n-k,k}-p:m*=k*k;k+=1;p|={m%k*k}
print n-k,k

Перевірте це на Ideone .

Як це працює

Ми використовуємо наслідки теореми Вілсона :

corollary of Wilson's theorem

У всі часи змінна m дорівнює квадрату факторіалу k - 1 ; k починається зі значення 1, а m - зі значення 0! ² = 1 . Набір p буде складатися з 0 і всіх простих чисел до поточного значення k .

У кожній ітерації спочатку перевіряємо, чи належать і n - k, і k p , що відповідає дійсності і тоді, і лише тоді, коли задана різниця {nk, k} і p порожня. Якщо це так, то стан хибний, і цикл продовжується.

Зауважимо, що k> 0 , а {n - k, k} буде задовольняти умову для деякого додатного значення n - k (якщо припустити, що гіпотеза Гольдбаха вірна), тому 0 в p не призведе до помилкових позитивних результатів.

У циклі ми оновлюємо k і m . Нове значення m дорівнює m × k² = (k - 1)! ² × k² = k! ² , а нове значення k дорівнює k + 1 , тому m = (k - 1)! ² все ще зберігається до і після оновлення.

Потім ми виконуємо задане об'єднання, щоб додати значення m% k × k до p . За наслідками теореми Вілсона це додасть 1 × k = k, якщо k є простим, а 0 × k = 0, якщо ні.

Коли цикл закінчується, ми друкуємо останні значення n - k і k , які будуть простими числами з сумою n .


Як на Землі працює цей простий алгоритм генерації?
Лина монашка

@LeakyNun Я додав пояснення.
Денніс

О ... це геній.
Лина монашка


4

PHP - 73 байти

<?for(;@($n%--$$n?:$o=&$argv[1]>$$n=++$n)||${++$b}^${--$o};);echo"$b+$o";

Введення приймається як аргумент командного рядка.

Використання зразка:

$ php goldbach.php 7098
19+7079

4

GolfScript 41 33 32

~(,2>.-1%]zip{{.,2>\{\%!}+,},!}?

Приймає аргумент командного рядка, наприклад

echo "14" | ruby golfscript.rb goldbach.gs
-> [2 12]

Знаходить усі відповідні розділи вхідного номера за допомогою:

(,2>.-1%]zip  #If only zip were a one-character command!  It is so often useful.

а потім знаходить перший розділ, де жодні числа НЕ є простими:

{np,!}? #For each partition, filter down to elements that are not prime, and only accept if there are no such results (since [] is falsey).

де блок складової перевірки np :

{.,2>\{\%!}+,}

цей блок фільтрується до всіх чисел, які рівномірно ділять задане число. Якщо таких номерів немає (значить, це число просте), результат - []це фальсифікація в GolfScript.



3

R, 170 112 83 символів

a=scan();b=2:a;p=b[rowSums(!outer(b,b,`%%`))<2];q=p[(a-p)%in%p][1];cat(a,":",q,a-q)

Відступ:

a=scan() #Take user input as a numeric
b=2:a
p=b[rowSums(!outer(b,b,`%%`))<2] #Find all primes from 2 to user input
q=p[(a-p)%in%p][1] #Check which a-p also belong to p and takes the first one
cat(a,":",q,a-q)

Використання:

> a=scan();b=2:a;p=b[rowSums(!outer(b,b,`%%`))<2];q=p[(a-p)%in%p][1];cat(a,":",q,a-q)
1: 72
2: 
Read 1 item
72 : 5 67 

Старе рішення на 112 символів, для нащадків

a=scan();b=2:a;p=b[rowSums(!outer(b,b,`%%`))<2];w=which(outer(p,p,`+`)==a,T);cat(a,":",p[w[1,1]],p[w[1,2]])

Відступ:

a=scan()
b=2:a
p=b[rowSums(!outer(b,b,`%%`))<2]
w=which(outer(p,p,`+`)==a,T) #Find the index of valid combinations
cat(a,":",p[w[1,1]],p[w[1,2]]) #Prints the first valid combination

Це і шалено, і геніально !!
Томаш

3

Пітон - 107

В основному покращення щодо другої частини відповіді нутрії (я провів це на 2.7, але, думаю, це також має працювати на 3.x)

p=lambda x:all(x%i!=0 for i in range(2,x))
n=input()
for i in range(2,n-1):
    if p(i)&p(n-i): print i,n-i

Чи є обов'язковими нові рядки та пробіли :?
mniip

Вкладку можна зменшити до пробілу, а простір перед друком можна буде видалити (відбриває 4 байти).
клісмік

3

JavaScript (ES6) (Regex), 105

a=/^(xx+?)(?!(xx+)\2+$)x*(?=\1$)(?!(xx+)\3+$)/.exec("x".repeat(prompt()));alert(a[1].length+"+"+a[0].length)

Тепер у вас є регекс, який тестує гіпотезу Goldbach, яка має низькі вимоги до спеціальних особливостей (основна підтримка зворотного посилання, позитивний та негативний погляд вперед).

Для цього використовується String.prototype.repeat() частина пропозиції EcmaScript 6-го видання. В даний час цей код працює лише на Firefox.

Мені дійсно потрібна краща мова, яка володіє непростими командами при роботі з регулярними виразками ...


2

Скала, 286 192 172 148 символів

Не найшвидший, але це працює. Зателефонуйте g (10), щоб отримати список золотих пар для 10.

def g(n:Int)={def p(n:Int,f:Int=2):Boolean=f>n/2||n%f!=0&&p(n,f+1)
s"$n : "+(for(i<-2 to n/2;j=n-i if p(i)&&p(j))yield s"$i + $j").mkString(" or ")}

Перетворення на C ++ просте.


2

C - 139 129 символів

a,b;i(x,y){return x>y?x%y?i(x,y+1):0:x>1;}main(){scanf("%i",&a);for(b=a/2;b-->1;)i(b,2)&&i(a-
b,2)&&printf("%i:%i+%i\n",a,b,a-b);}

Ви можете поголити 8 символів, видаливши intдекларації у своїй функції i. Ви можете зберегти ще два символи, видаливши ifта додавши ще одну подвійну амперсанд:i(b,2)&&i(a-b,2)&&printf(...)
Джош

Спасибі! Не думав про це &&. (Я ніколи не звикну до аргументації типу замовчування ...)
Оберон,

Я люблю ваше використання вкладеного потрійного.
Джош

2

newLISP - 169 148 символів

(define(p n)(=(length(factor n))1))
(define(g n)(when(even? n)(for(i 3 n 2)
(and(p i)(p(- n i))(println n {: } i { }(- n i))))))
(g(int(read-line)))

включає код для його запуску. Результати є надмірно щедрими ...

72: 5 67
72: 11 61
72: 13 59
72: 19 53
72: 29 43
72: 31 41
72: 41 31
72: 43 29
72: 53 19
72: 59 13
72: 61 11
72: 67 5

2

Шавлія, 60

Схожий за балом і відчуваєш рішення рішення , але я думаю, що це досить інше, щоб розміщувати повідомлення.

i=n=input()
while not{i,n-i}<set(primes(n)):i-=1
print i,n-i

2

Мудрець , 65 62

n=input()
i=0
p=is_prime
while p(i)*p(n-i)==0:i+=1
print i,n-i

Маючи вищезазначене у файлі goldbach.sage, виконайте його, коли Sage працює в терміналі:

sage: %runfile goldbach.sage 

Дякуємо @boothby за p=is_primeідею.


Ви можете встановити це до 62, встановивши p=is_prime.
кабінка

2

Хаскелл, 97С

g n=head[(a,b)|let q=p n,a<-q,b<-q,a+b==n]
p n=filter c[2..n]
c p=null[x|x<-[2..p-1],p`mod`x==0]

Пояснення:

  • gє функцією "золота". Виклик g nдає вам пару простих ліній, до яких додається n.
  • pце функція, яка генерує список простих чисел менше, ніж n.
  • c- це функція головної перевірки, яка використовується для визначення p.

Приклад виконання:

*Main> g 4
(2,2)
*Main> g 6
(3,3)
*Main> g 8
(3,5)
*Main> g 10
(3,7)
*Main> g 12
(5,7)
*Main> map g [4,6..100]
[(2,2),(3,3),(3,5),(3,7),(5,7),(3,11),(3,13),(5,13),(3,17),(3,19),(5,19),(3,23),(5,23),(7,23),(3,29),(3,31),(5,31),(7,31),(3,37),(5,37),(3,41),(3,43),(5,43),(3,47),(5,47),(7,47),(3,53),(5,53),(7,53),(3,59),(3,61),(5,61),(7,61),(3,67),(5,67),(3,71),(3,73),(5,73),(7,73),(3,79),(5,79),(3,83),(5,83),(7,83),(3,89),(5,89),(7,89),(19,79),(3,97)]

2

Математика 56

Це повертає всі рішення цілого числа.

Select[Tuples[Prime@Range@PrimePi[n = Input[]], 2], Tr@# == n &]

Наприклад, коли вводиться 1298 ...

{{7, 1291}, {19, 1279}, {61, 1237}, {67, 1231}, {97, 1201}, {127, 1171}, {181, 1117}, {211, 1087}, { 229, 1069}, {277, 1021}, {307, 991}, {331, 967}, {379, 919}, {421, 877}, {439, 859}, {487, 811}, {541, 757}, {547, 751}, {571, 727}, {607, 691}, {691, 607}, {727, 571}, {751, 547}, {757, 541}, {811, 487} , {859, 439}, {877, 421}, {919, 379}, {967, 331}, {991, 307}, {1021, 277}, {1069, 229}, {1087, 211}, { 1117, 181}, {1171, 127}, {1201, 97}, {1231, 67}, {1237, 61}, {1279, 19}, {1291, 7}}

Як написано, воно повертає кожне рішення двічі.

Union[Sort/@ %]

{{7, 1291}, {19, 1279}, {61, 1237}, {67, 1231}, {97, 1201}, {127, 1171}, {181, 1117}, {211, 1087}, { 229, 1069}, {277, 1021}, {307, 991}, {331, 967}, {379, 919}, {421, 877}, {439, 859}, {487, 811}, {541, 757}, {547, 751}, {571, 727}, {607, 691}}


Вхід 2, запитайте оракула, чи він зупиняється, доведіть / спростуйте гіпотезу про близнюків, переможете
Filipq

1

Джулія, 62 символи (85 з підказкою)

julia> g(n)=collect(filter((x)->sum(x)==n,combinations(primes(n),2)))
g (generic function with 1 method)

julia> g(88)
4-element Array{Array{Int64,1},1}:
 [5,83] 
 [17,71]
 [29,59]
 [41,47]

Це не підказує користувача (як потрібно), чи не так?
res

Ні, цього не помічав. Це додало б багато символів зараз Джулія. g(int(readline(STDIN)))
gggg

1

GTB , 31

Для вашого калькулятора TI-84

`A:.5A→B@%;A,4)4$~B+1,B-1#~B,B&

Немає простих вбудованих модулів.

Приклад виконання

?4
               2
               2
?6
               3
               3
?8
               3
               5
?10
               5
               5


1

Пітон 3 - 150 143 символи

Стара версія (150 символів):

p=lambda n:0 in[n % i for i in range(2,n)]
n=int(input())
[print('%d+%d'%(a, b))for b in range(2,n)for a in range(2,n)if not(a+b!=n or p(a) or p(b))]

Нова версія (завдяки ProgramFOX):

p=lambda n:0 in[n%i for i in range(2,n)]
n=int(input())
[print('%d+%d'%(a,b))for b in range(2,n)for a in range(2,n)if not((a+b!=n)|p(a)|p(b))]

Він друкує кожну комбінацію, наприклад:
4 2 + 2
10 7 + 3 5 + 5 3 + 7


|можна сміливо використовувати булевий тип, тому(a+b!=n)|p(a)|p(b)
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Ще коротше за допомогою: print([(a,b)for b in range(2,n)for a in range(2,n)if not((a+b!=n)|p(a)|p(b))])(друкує список кортежів, сума яких дорівнює n). Економить 8 байт.
agtoever

Також використання r=range(2,n)та посилання rзаощаджує ще кілька.
agtoever

1

q [116 знаків]

y where all each{{2=count where 0=(x mod)each til x+1}each x}each y:{a where x=sum each a:a cross a:til x}"I"$read0 0

Немає вбудованої функції для пошуку простого числа.

Вхідні дані

72

Вихідні дані

5  67
11 61
13 59
19 53
29 43
31 41
41 31
43 29
53 19
59 13
61 11
67 5

1

Пітон - 206

Трохи запізнююся на вечірку, але я практикую свої навички гольфу.

Я фактично зашифрував це, перш ніж знайшов це питання! Таким чином, моя не включає прекрасну лямбда, яку використовують інші рішення Python.

import math
def p(n):
    if n%2==0&n>2:return False
    for i in range(3,n):
        if n%i==0:return False
    return True 
X=int(input())
for i in range(2,X):
    if p(i)&p(X-i):print i,X-i;break

1

J - 35 32 char

"Запросіть користувача" - це основна гравець кожного J-гольфіста. Туди ходять усі мої важко зароблені персонажі!

p:(n,n)#:i.&n,+/~p:i.n=:".1!:1]1

Пояснили:

  • ".1!:1]1- Прочитайте рядок ( 1!:1) з введення (обробка файлу 1) і перетворіть його в число ( ".).
  • p:i.n=:- Призначте це число змінній n, а потім зробіть перші nпраймери.
  • +/~- Складіть таблицю доповнення, nшироку та nвисоку.
  • i.&n,- Перетворіть таблицю в єдиний список, а потім знайдіть індекс першого появи n, який існує, якщо гіпотеза Гольдбаха відповідає дійсності.
  • p:(n,n)#: - Отримайте рядок і стовпець з індексу та візьміть відповідні праймери.

Використання:

   p:(n,n)#:i.&n,+/~p:i.n=:".1!:1]1
666
5 661
   p:(n,n)#:i.&n,+/~p:i.n=:".1!:1]1
1024
3 1021

Якщо підказка не була вимогою, ось дієслово з 25 символами:

(,~p:@#:]i.~&,+/~@:p:@i.)


1

Джулія, 50 49 байт

~=primes;n=ARGS[]|>int
(n-~n)∩~n|>extrema|>show

Спробуйте в Інтернеті!

Якщо функція була прийнятною, код можна було скоротити до 32 байт :

~=primes
!n=(n-~n)∩~n|>extrema

Як це працює

~=primesстворює псевдонім для вбудованої функції праймес, яка повертає список усіх простих чисел до аргументу. n=ARGS[]|>intаналізує перший аргумент командного рядка, як зберігає його в n .

Для того, щоб знайти відповідну пару простих ліній, спочатку обчислимо вищезгаданий простір ~n. Тоді, n-~nдає всі відмінності цих прайменів і n .

Перетинаючи ( ) результат із самим простим діапазоном, ми переконуємося, що решта прямих p такі, що n - p також є простим.

Нарешті, extremaзаймає найнижчий і найвищий розкрій на перехресті, тому їх сума повинна бути n .


0

SQL, 295 284

У postgresql:

create function c(c int) returns table (n int, m int) as $$ 
with recursive i(n) as
(select 2 union all select n+1 from i where n<c), 
p as (select * from i a where not exists 
(select * from i b where a.n!=b.n and mod(a.n,b.n)=0))
select * from p a, p b where a.n+b.n=c 
$$ language sql;

Якщо це було б не в таких речах, як "відсутнє ліве зовнішнє об'єднання в рекурсії", "жоден підзапит в рекурсії", він повинен бути в змозі це зробити ...

Ось результат:

postgres=# select c(10);
   c   
-------
 (3,7)
 (5,5)
 (7,3)
(3 rows)

postgres=# select c(88);
   c    
---------
 (5,83)
 (17,71)
 (29,59)
 (41,47)
 (47,41)
 (59,29)
 (71,17)
 (83,5)
(8 rows)

0

Партія - 266

@echo off&setLocal enableDelayedExpansion&for /L %%a in (2,1,%1)do (set/aa=%%a-1&set c=&for /L %%b in (2,1,!a!)do set/ab=%%a%%%%b&if !b!==0 set c=1
if !c! NEQ 1 set l=!l!%%a,)&for %%c in (!l!)do for %%d in (!l!)do set/ad=%%c+%%d&if !d!==%1 set o=%%c + %%d
echo !o!

Викладіть акуратно -

@echo off
setLocal enableDelayedExpansion
for /L %%a in (2,1,%1) do (
    set /a a=%%a-1
    set c=
    for /L %%b in (2,1,!a!) do (
        set /a b=%%a%%%%b
        if !b!==0 set c=1
    )
    if !c! NEQ 1 set l=!l!%%a,
)
for %%c in (!l!) do for %%d in (!l!) do (
    set /a d=%%c+%%d
    if !d!==%1 set o=%%c + %%d
)
echo !o!

0

Perl 5, 58 байт

57, плюс 1 за -nE

/^(11+?)(?!(11+)\2+$)1*(?=\1$)(?!(11+)\3+$)/;say for$1,$&

Вхід і вихід не є одинаковими. Приклад:

$ perl -nE'/^(11+?)(?!(11+)\2+$)1*(?=\1$)(?!(11+)\3+$)/;say for$1,$&'
1111111111
111
1111111

Шапка-наконечник.


0

Oracle SQL 11.2, 202 байт

WITH v(x,y,s)AS(SELECT LEVEL,LEVEL,0 FROM DUAL CONNECT BY LEVEL<=:1 UNION ALL SELECT x,y-1,s+SIGN(MOD(x,y))FROM v WHERE y>1),p AS(SELECT x FROM v WHERE x-s=2)SELECT a.x,b.x FROM p a,p b WHERE:1=a.x+b.x;   

Без гольфу

WITH v(x,y,s) AS
(
  SELECT LEVEL,LEVEL,0 FROM DUAL CONNECT BY LEVEL<=:1 
  UNION ALL 
  SELECT x,y-1,s+SIGN(MOD(x,y))FROM v WHERE y>1
)
,p AS (SELECT x FROM v WHERE x-s=2)
SELECT a.x,b.x 
FROM p a,p b 
WHERE :1=a.x+b.x;   

0

Python 3, 107 байт

b=lambda x:all(x%y for y in range(2,x))
g=lambda x,i=2:((i,x-i)if b(i)&b(x-i)else g(x,i+1))if(i<x)else 0

b (x) - тест первинності для x, а g (x) повторюється через числа, щоб знайти два простих числа, які підходять.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.