Ваша цель - вывести строго возрастающую последовательность последовательных одинаковых цифр числа pi (π). Каждый член в последовательности должен быть на одну цифру длиннее предыдущего. Таким образом 3
(0-ая цифра числа пи) - это первый раз, когда происходит серия цифр (длина 1). Следующее происходит 33
(цифры 24 и 25 от пи). Конечно, эта последовательность требует, чтобы цифры числа pi находились в базе 10 .
Те, которые известны до сих пор , и первые шесть встречаются в первых 800 цифрах:
3
33
111
9999
99999
999999
3333333
44444444
777777777
6666666666
... (not in first 2 billion digits)
Обратите внимание, что все последовательные девятки встречаются вместе в одном и том же прогоне, поэтому, если следующий крупный прогон, который вы обнаружили, будет 1000 последовательных 0
с, это будет заполнять несколько членов последовательности.
Я не нашел больше условий с моей программой. Я знаю, что в первых 50000 цифрах и более больше нет терминов. Моя программа заняла слишком много времени с 500000 цифр, поэтому я сдался.
Ты можешь:
- Выведите последовательность навсегда
- Возьмите целое число
n
и найдите первыеn
числа в последовательности - Возьмите целое число
n
и найдите числа в последовательности, содержащейся в первыхn
цифрах числа пи.
Обязательно укажите, какой код делает ваш. Число n
может быть нулевым или индексированным.
Вдохновлен этим вопросом Mathoverflow .
Ответы:
Mathematica, 85 байт
Анонимная функция. Принимает n в качестве входных данных и возвращает элементы последовательности в первых n цифрах π. Вывод в виде
{0, 3, 33, 111, ...}
.источник
Python 2, 110 байт
Максимальное количество проверяемых цифр берется из стандартного ввода. 10000 цифр заканчиваются примерно через 2 с PyPy 5.3.
Образец использования
Что-то полезное
Для этого я перешел с Чудновского на Рамануджана 39. У Чудновского не хватило памяти в моей системе вскоре после 100 миллионов цифр, но Рамануджан довел ее до 400 миллионов всего за 38 минут. Я думаю, что это еще один случай, когда более медленный темп роста выигрывает в конце, по крайней мере, в системе с ограниченными ресурсами.
Образец использования
Более быстрые неограниченные генераторы
Ссылочная реализация, приведенная в описании проблемы, интересна. Он использует неограниченный генератор, взятый непосредственно из статьи « Неограниченные алгоритмы Spigot для цифр числа Пи» . По словам автора, представленные реализации являются «намеренно неясными», поэтому я решил сделать свежие реализации всех трех алгоритмов, перечисленных автором, без преднамеренного запутывания. Я также добавил четвертый, основанный на Рамануджане # 39 .
Примечания
Выше приведены 6 реализаций: две ссылочные реализации, предоставленные автором (обозначены
_ref
), и четыре, которые вычисляют термины в пакетах, генерируя несколько цифр одновременно (_md
). Все реализации были подтверждены до 100 000 цифр. При выборе размеров партии я выбирал значения, которые со временем постепенно теряют точность. Например,g1_md
генерирует 10 цифр на пакет с 33 итерациями. Однако это даст только ~ 9,93 правильных цифр. Когда прекратится точность, условие проверки не будет выполнено, что приведет к запуску дополнительной партии. Это кажется более производительным, чем постепенно увеличивающаяся, ненужная точность с течением времени.Сохраняется дополнительная переменная
j
, представляющая2*i+1
. Автор делает то же самое в ссылочной реализации. Расчетn
отдельно гораздо проще (и менее неясный), потому что он использует текущие значенияq
,r
иt
, а не на следующем.Проверка,
n == q/s
по общему признанию, довольно слабая. Это следует читатьn == (q*(k+2*j+4)+r)/(s*(k+2*j+4)+t)
, гдеj
есть2*i-1
иk
естьi*i
. При более высоких итерацийr
иt
условия становятся все менее значимыми. Как, это хорошо для первых 100 000 цифр, так что это, вероятно, хорошо для всех. Автор не предоставляет справочную реализацию.Автор полагает, что нет необходимости проверять, что
n
не изменится на последующих итерациях, и что это только замедляет алгоритм. Хотя, вероятно, это правда, генератор держит на ~ 13% больше правильных цифр, чем генерировал в настоящее время, что кажется несколько расточительным. Я добавил чек обратно и жду, пока 50 цифр будут правильными, генерируя их все сразу, с заметным приростом производительности.Рассчитано как
К сожалению,
s
не обнуляется из-за начального (3528 ÷) состава, но все равно значительно быстрее, чем g3. Сходимость составляет ~ 5,89 цифр за семестр, за один раз генерируется 3511 цифр. Если это немного, генерирование 271 цифры за 46 итераций также является достойным выбором.Задержки
Взятые на моей системе, только для сравнения. Время указано в секундах. Если время заняло больше 10 минут, я больше не проводил никаких тестов.
Интересно, что в
g2
конечном итоге обгоняетg3
, несмотря на более медленную скорость сближения. Я подозреваю, что это потому, что операнды растут значительно медленнее, выигрывая в долгосрочной перспективе. Самая быстраяg4_md
имплентация примерно в 235 раз быстрее, чем имплементацияg3_ref
на 500 000 цифр. Тем не менее, таким образом все еще существуют значительные издержки для потоковых цифр. Вычисление всех цифр напрямую с использованием Ramanujan 39 ( источник Python ) примерно в 10 раз быстрее.Почему не Чудновский?
Алгоритм Чудновского требует квадратного корня с полной точностью, в котором я, честно говоря, не уверен, как работать - предполагая, что это вообще может быть. Рамануджан 39 несколько особенный в этом отношении. Тем не менее, кажется, что этот метод может быть полезен для машиноподобных формул, таких как те, что используются y-cruncher, так что это может быть целью, которую стоит изучить.
источник
Haskell, 231 байт
Это использует Алгоритмы неограниченного Spigot для цифр числа Пи от Джереми Гиббонс, 2004. Результат
p
. Технически, он должен поддерживать бесконечные выходные последовательности, но это может занять некоторое время (и ограничено вашей памятью).источник
Python 2, 298 байт
Обратите внимание, что код для генерации pi взят из реализации OP.
Моя первая попытка игры в гольф на Python. Выводит последовательность навсегда.
источник
π
здесь? Вы, конечно, рассчитываете пи, верно?π
там не рассчитываете вечно?yield
который останавливает его, но я не очень хорош вp
частиPython 3.5,
278263 байта:Это принимает в
n
качестве входных данных первыеn
цифрыπ
и затем выводит члены последовательности в этих первыхn
цифрах. Теперь он использует встроенный в Python десятичный модуль, чтобы выйти за пределы ограничений Python с плавающей запятой, а затем устанавливает точность, или эпсилон, сколь угодно большого количества пользовательского ввода. Затем, чтобы вычислитьπ
, это проходит 50 итераций с использованием эффективного алгоритма Гаусса-Лежандра , поскольку алгоритм, по-видимому, удваивает количество правильных цифр каждый раз, и, следовательно, за 50 итераций мы можем получить2^50
или1,125,899,906,842,624
исправить цифры. Наконец, после выполнения вычисленийwhile
для поиска и печати используется регулярное выражение с форматированием строки в цикле.re
сопоставлять объекты (что, я надеюсь, хорошо) для всех непрерывных, повторяющихся цифр на 1 цифру длиннее, чем в предыдущей итерации цикла.Я смог использовать этот алгоритм для успешного и точного вычисления
π
до10,000,000
(десяти миллионов) цифр, что заняло около 4 часов и 12 минут. Следующим был окончательный результат:Итак, я могу с уверенностью сказать, что 8-е число в последовательности даже не встречается в пределах первых 10 миллионов цифр!
π
это одно случайное число ...источник