Существует довольно большое количество простых производящих функций. Практически все они построены и основаны на сите Эратосфена, функции Мёбиуса или теореме Вильсона и, как правило, невозможно вычислить на практике. Но есть и генераторы, которые имеют очень простую структуру и были найдены случайно.
В 2003 году Стивен Вольфрам исследовал класс вложенных рекуррентных уравнений в эксперименте с живым компьютером в Летней школе NKS. Группа людей вокруг Мэтью Фрэнка провела дополнительные эксперименты и обнаружила интересное свойство просто повторения
a(n) = a(n-1) + gcd(n,a(n-1))
с начальным значением a(1) = 7
. Разница a(n) - a(n-1) = gcd(n,a(n-1))
всегда казалась 1 или простым. Первые несколько отличий ( OEIS A132199 ):
1, 1, 1, 5, 3, 1, 1, 1, 1, 11, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 3, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 47, 3, 1, 5, 3, ...
Если мы пропустим только 1, мы получим следующую последовательность ( OEIS A137613 ):
5, 3, 11, 3, 23, 3, 47, 3, 5, 3, 101, 3, 7, 11, 3, 13, 233, 3, 467, 3, 5, 3,
941, 3, 7, 1889, 3, 3779, 3, 7559, 3, 13, 15131, 3, 53, 3, 7, 30323, 3, ...
Эрик С. Роуланд доказал первичность каждого элемента в этом списке несколько лет спустя. Как видите, простые числа смешаны, и некоторые из них появляются несколько раз. Также было доказано, что последовательность включает в себя бесконечно много различных простых чисел. Кроме того, предполагается, что появляются все нечетные простые числа.
Поскольку этот простой генератор не был построен, а просто найден случайно, основной генератор называется «встречающимся в природе». Но обратите внимание, что на практике этот генератор также невозможно вычислить. Как оказалось, простое число p появляется только после (p–3)/2
последовательных 1 с. Тем не менее, реализация этого простого генератора будет вашей задачей.
Вызов:
Напишите функцию или программу, которая печатает первые n
элементы последовательности A137613
(последовательность без 1). Вы можете прочитать входной номер n >= 0
через STDIN, аргумент командной строки, приглашение или аргумент функции. Выведите первые n
элементы в любом читаемом формате в STDOUT или верните массив или список с этими значениями.
Это код-гольф. Поэтому самый короткий код выигрывает.
Leaderboard:
Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам. Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
# Language Name, N bytes
где N - размер вашей заявки. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
# Ruby, <s>104</s> <s>101</s> 96 bytes
var QUESTION_ID=55272;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),e.has_more?getAnswers():process()}})}function shouldHaveHeading(e){var a=!1,r=e.body_markdown.split("\n");try{a|=/^#/.test(e.body_markdown),a|=["-","="].indexOf(r[1][0])>-1,a&=LANGUAGE_REG.test(e.body_markdown)}catch(n){}return a}function shouldHaveScore(e){var a=!1;try{a|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(r){}return a}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading),answers.sort(function(e,a){var r=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0],n=+(a.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0];return r-n});var e={},a=1,r=null,n=1;answers.forEach(function(s){var t=s.body_markdown.split("\n")[0],o=jQuery("#answer-template").html(),l=(t.match(NUMBER_REG)[0],(t.match(SIZE_REG)||[0])[0]),c=t.match(LANGUAGE_REG)[1],i=getAuthorName(s);l!=r&&(n=a),r=l,++a,o=o.replace("{{PLACE}}",n+".").replace("{{NAME}}",i).replace("{{LANGUAGE}}",c).replace("{{SIZE}}",l).replace("{{LINK}}",s.share_link),o=jQuery(o),jQuery("#answers").append(o),e[c]=e[c]||{lang:c,user:i,size:l,link:s.share_link}});var s=[];for(var t in e)e.hasOwnProperty(t)&&s.push(e[t]);s.sort(function(e,a){return e.lang>a.lang?1:e.lang<a.lang?-1:0});for(var o=0;o<s.length;++o){var l=jQuery("#language-template").html(),t=s[o];l=l.replace("{{LANGUAGE}}",t.lang).replace("{{NAME}}",t.user).replace("{{SIZE}}",t.size).replace("{{LINK}}",t.link),l=jQuery(l),jQuery("#languages").append(l)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/,NUMBER_REG=/\d+/,LANGUAGE_REG=/^#*\s*([^,]+)/;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table></div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table></div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table><table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table>
a(n)-a(n-1)
n
быть ноль?//
) и объясните это в своем представлении. Если кто-то не согласен с вами, вы всегда можете отредактировать свой пост.Ответы:
Pyth,
1413 байтовИспользует
a(n) = Lpf(6 - n + sum(a(i) for i in range(1, n))
гдеLpf
означает наименьший простой фактор.Попробуйте здесь онлайн.
источник
Python 3.5.0b1 +,
9593 байтаСсылка на Python 3.5.0b1 + релиз
Прямая реализация повторения, показывающая:
1%x
иmath.gcd
, в отличие отfractions.gcd
.источник
1%x
? Дополнительный вопрос: где я могу найти документацию по истории изменений Python, которая включает в себя бета-версии? Изменить: Nevermind, нашел его в нижней части истории изменений .x >= 1
,1%x
возвращает 0, еслиx == 1
1, в противном случае (используется, чтобы решить, следует ли добавитьx
в список)Юлия, 110 байт
Ungolfed:
источник
n<2
вместоn==1
. Кроме того, если вы смотрите вперед, а не назад, вы можете использоватьi=1
иx=a(i)-a(i+=1)
, а затемprintln(-x)
и-x>1
исправить негативность, тем самым избегая необходимости отдельного увеличенияi
. И≥
это три байта, а>=
это два ... но тогда вы можете использовать,n<1||()
а неn>=1&&()
... и, тем не менее, это даже не нужно в первую очередь (отбросьте условное, n никогда не будет меньше 1). Вам также не нужны внешние скобки при определении (n). С этими изменениями вы должны как минимум сократить до 97 байт.PHP,
1019699987772 байтаИспользование:
Вызовите скрипт с аргументом:
php -d error_reporting=0 script.php 30
если вы хотите протестировать его, вам нужно раскомментировать
;extension=php_gmp.dll
в вашем php.ini->
extension=php_gmp.dll
Должен ли я добавить расширение к моему счетчику байтов? Есть предположения?
Лог:
Сохранено 3 байта благодаря Исмаилу Мигелю.
Сохранено 26 байтов благодаря primo.
источник
<?
и удалить определение$j
.<
в$j<=$argv[1]
(печатает слишком много) (-1). Оставьте$e
неинициализированным, используйте$e+7
вместо этого (-3). Используйтеfor(;;)
вместо тогоwhile()
, чтобы использовать пре- и пост-выражения (-2). Заменитьecho$t.' ';$j++
на$j+=print"$t "
, опустить скобки (-3). Заменитьif($t>1)
на2>$t||
(-2). Объедините присвоение$t
с условным, переключитесь||
наor
, снимите скобки (-5). Перейти$argv[1]
к$j
приращению, переместить все выражение вfor
условное (-2). Изменить>=$j+=print
на-=print
(-3). Шаг за шагом: codepad.org/s6LNSPSM$e+7
с$e+=$t
(-2). Оставьте$i
неинициализированным, используйте~++$i
вместо этого (-3). codepad.org/fDIImajpHaskell, 51 байт
Обратите внимание, что
f
это функция, которая будет возвращать первые n элементов.Вместо того, чтобы вычислять
a(n)
и затем обрабатывать различия, мы вычисляем различияd(n)
и суммируем их вместе, чтобы получитьa(n)
. (Те, кто не знаком с Haskell, могут возразить, чтоa(n)
сначала нам нужно получить ихd(n)
, но, конечно, ленивая оценка помогает нам решить эту проблему!)Ungolfed:
источник
Pyth, 30 байт
Очень плохо играется в гольф, может быть значительно уменьшена. Определяет рекурсивную функцию спереди, фильтрует
.f
irst-n, а затем отображает разницу.Попробуйте здесь онлайн .
источник
n = 0
Юлия,
6967 байтЭто простое итеративное решение проблемы.
x
это разница (которая естьgcd
), а затем я обновляюa
, добавляяx
.источник
JavaScript (ES6), 91
Рекурсивный gcd, итерационная основная функция. Не так быстро.
Обычное примечание: тестирование запуска сниппета в любом браузере, совместимом с EcmaScript 6 (особенно не Chrome и не MSIE. Я тестировал на Firefox, Safari 9 мог пойти)
источник
Haskell,
747166 байтИспользовал трюк здесь: https://codegolf.stackexchange.com/a/39730/43318 , и сделал бессмысленно.
(Предыдущий: 71 байт)
Сначала сделайте последовательность а, а затем возьмите различия.
(Предыдущий: 74 байта)
Стандартные функции списка, плюс умное использование лямбда-функции. Обратите внимание, что это на 1 байт короче, чем более очевидный
Если мы не будем считать импорт, я могу уменьшить его до 66.
источник
PARI / GP, 60 байтов
Взятые более или менее прямо из определения a (n) - a (n-1) = gcd (n, a (n-1))
Выход для
a(20)
:источник
C ++,
193182180172 байтаСпасибо @Jakube - сэкономил 8 байт на выходе.
источник
f
, которая возвращает массив с результатами. Таким образом, вы можете удалить include, scanf и print.Mathematica, 59 байт
источник