Гипотеза Гольдбаха утверждает, что каждое четное число, большее двух, может быть выражено как сумма двух простых чисел. Например,
4 = 2 + 2
6 = 3 + 3
8 = 5 + 3
Однако, как только мы доберемся до 10, происходит нечто интересное. Не только 10 можно записать как
5 + 5
но это также можно записать как
7 + 3
Поскольку 10 можно выразить как сумму двух простых чисел двумя способами , мы говорим, что «разбиение Гольдбаха» в 10 есть 2
. Или, в общем,
Разделение Голдбаха числа - это общее количество различных способов записи,
n = p + q
гдеp
иq
являются простыми числами иp >= q
Ваша задача состоит в том, чтобы написать программу или функцию, которая находит раздел Голдбаха числа. Теперь технически термин «раздел Гольдбаха» используется только для обозначения четных чисел. Однако, поскольку нечетное целое число p + 2 также может быть выражено как сумма двух простых чисел, если p> 2 простое, мы расширим это на все натуральные числа ( A061358 ).
Вы можете смело предполагать, что ваши входные данные всегда будут положительным целым числом, и вы можете использовать входные и выходные данные любым из наших разрешенных методов по умолчанию , например, аргументы функций и возвращаемое значение, STDIN и STDOUT, чтение и запись в файл и т. Д.
Разделы Гольдбаха с положительными целыми числами до 100:
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
Как обычно, применяются стандартные лазейки, и выигрывает самый короткий ответ в байтах!
Ответы:
Желе , 8 байт
Попробуйте онлайн! или проверьте все контрольные примеры .
Как это устроено
источник
Python 2, 76 байт
Рекурсивно ползет вверх от
k=2
доn/2
, складывая значения, где обаk
иn-k
просты. Было бы неплохо начатьn
обратный отсчет в одно и то же время, но есть проблема, котораяk=0
иk=1
ложно называется простой:Проверка первичности - это пробное деление, сокращается путем проверки как вместе, так
k
иn-k
вместе. Я обнаружил, что это короче, чем использование генератора теорем Вильсона (79 байт):Идея для этого состоит в том, чтобы сохранить список всех простых чисел в нижней половине, чтобы их можно было проверить к тому времени, когда мы доберемся до верхней половины, но для средней точки
k=n/2
у нас не было времени, чтобы добавитьn-k
в список, когда мы добираемся доk
, Итеративная версия обходит это, но составляет 82 байта:источник
MATL , 8 байт
Попробуйте онлайн!
объяснение
Рассмотрим ввод
8
в качестве примераИнтересно наблюдать за графиком последовательности , используя слегка измененную версию кода:
Для ввода
10000
результатВы можете попробовать это в MATL Online ( обновите страницу, если кнопка «Выполнить» не изменится на «Убить» при нажатии). Создание графика для ввода занимает около 25 секунд
3000
; истекает время ожидания входных данных выше нескольких тысяч.источник
Upper triangular part
трюк действительно крутой!JavaScript (ES6),
777370 байтСохранено 3 байта благодаря @Arnauld
f
является функцией теста на простоту; соответствующая функцияg
.f
работает рекурсивным обратным отсчетом от n-1 ; поток управления на каждом этапе выглядит следующим образом:x<2||
Если x <2 , число простое; вернуть 1 .n%x&&
В противном случае, если n mod x = 0 , число не простое; вернутьсяn%x
.f(n,x-1)
В противном случае число может быть или не быть простым; уменьшите х и попробуйте снова.g
работает аналогичным образом, но с не очень большим потоком управления. Это работает, умножая f (b) на f (ab) для каждого целого числа b в диапазоне [2, floor (a / 2)] , затем суммируя результаты. Это дает нам число пар, сумма к а где оба числа в паре являются простыми, а это именно то , что мы хотим.источник
a
как положительно,b=a>>1
должен сэкономить вам байт.>>
оператора ...f=(n,x=n)=>--x<2||n%x&&f(n,x)
?05AB1E ,
108 байтКрайне неэффективно.
Попробуйте онлайн! или попробуйте менее эффективный способ генерации простых чисел
объяснение
n = 10
используется в качестве примера.источник
ü
вместо этого? КакD!fü+r¢
?n=10
, который будет считать (10, [5,8,12]), который равен 0 вместо 2.ü
, применяется только к каждой паре элементов. Это дало мне идею попробоватьã
, но, к сожалению, это оказалось на 1 байт длиннее.GAP , 57 байт
Я не думаю, что GAP имеет более короткий путь, чем этот очевидный.
Number
подсчитывает, сколько элементов списка удовлетворяют предикату.Используя его для вычисления первых 100 значений:
источник
Брахилог , 22 байта
Попробуйте онлайн!
объяснение
Прямая транскрипция проблемы.
источник
Mathematica, 52 байта
Результат предоставляется как анонимная функция. Попробуйте построить график поверх него:
Кстати, код имеет одинаковую длину с версией функции демо-кода на OEIS.
источник
PrimeQ[#~IntegerPartitions~{2}]~Count~{a=True,a}&
Желе , 12 байт
TryItOnline
1-100
Как?
источник
Ракетка 219 байт
Ungolfed:
Тестирование:
Выход:
источник
На самом деле , 11 байтов
Попробуйте онлайн!
Объяснение:
источник
05AB1E , 6 байтов
Попробуйте онлайн!
Объяснение:
источник
Haskell, 73 байта
Пример использования:
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
для всехp
иq
отr
гдеq<=p
иp+q==n
и просуммировать их.источник