Votre objectif est de produire la séquence strictement croissante de chiffres consécutifs identiques de pi (π). Chaque terme de la séquence doit avoir un chiffre de plus que le précédent. Donc 3
(0ème chiffre de pi) est la première fois qu'une série de chiffres se produit (longueur 1). Le prochain à se produire est 33
(chiffres 24 et 25 de pi). Bien sûr, cette séquence nécessite que les chiffres de pi soient en base 10 .
Ceux connus jusqu'à présent , et les six premiers se produisent tous dans les 800 premiers chiffres:
3
33
111
9999
99999
999999
3333333
44444444
777777777
6666666666
... (not in first 2 billion digits)
Notez que les neuf consécutifs se produisent tous ensemble, dans la même exécution, donc si la prochaine exécution plus importante que vous avez trouvée était de 1000 0
s consécutifs , cela remplirait plusieurs termes de la séquence.
Je n'ai plus trouvé de termes avec mon programme. Je sais qu'il n'y a plus de termes dans les 50000 premiers chiffres ou plus. Mon programme prenait trop de temps avec 500 000 chiffres, j'ai donc abandonné.
Tu peux:
- Sortez la séquence pour toujours
- Prenez un entier
n
et trouvez les premiersn
nombres de la séquence - Prenez un entier
n
et trouvez les nombres dans la séquence contenue dans les premiersn
chiffres de pi.
Assurez-vous de spécifier celui que votre code fait. Le nombre n
peut être zéro ou un indexé.
Inspiré par cette question mathoverflow .
Réponses:
Mathematica, 85 octets
Fonction anonyme. Prend n en entrée et renvoie les éléments de la séquence dans les n premiers chiffres de π. La sortie est sous la forme de
{0, 3, 33, 111, ...}
.la source
Python 2, 110 octets
Le nombre maximum de chiffres à vérifier est pris à partir de stdin. 10000 chiffres se termine en environ 2s avec PyPy 5.3.
Exemple d'utilisation
Quelque chose d'utile
Je suis passé de Chudnovsky à Ramanujan 39 pour cela. Chudnovsky a manqué de mémoire sur mon système peu de temps après 100 millions de chiffres, mais Ramanujan est arrivé à 400 millions, en seulement 38 minutes environ. Je pense que c'est un autre cas où le taux de croissance plus lent des termes l'emporte finalement, au moins sur un système avec des ressources limitées.
Exemple d'utilisation
Des générateurs illimités plus rapides
L'implémentation de référence donnée dans la description du problème est intéressante. Il utilise un générateur illimité, directement extrait du document Unbounded Spigot Algorithms for the Digits of Pi . Selon l'auteur, les implémentations fournies sont "délibérément obscures", j'ai donc décidé de faire de nouvelles implémentations des trois algorithmes répertoriés par l'auteur, sans obstruction délibérée. J'ai également ajouté un quatrième, basé sur Ramanujan # 39 .
Remarques
Ci-dessus se trouvent 6 implémentations: les deux implémentations de référence fournies par l'auteur (notées
_ref
), et quatre qui calculent les termes par lots, générant plusieurs chiffres à la fois (_md
). Toutes les implémentations ont été confirmées à 100 000 chiffres. Lors du choix des tailles de lot, j'ai choisi des valeurs qui perdent lentement en précision avec le temps. Par exemple,g1_md
génère 10 chiffres par lot, avec 33 itérations. Cependant, cela ne produira que ~ 9,93 chiffres corrects. Lorsque la précision est épuisée, la condition de vérification échoue, ce qui déclenche l'exécution d'un lot supplémentaire. Cela semble être plus performant que la précision supplémentaire lentement gagnée, inutile au fil du temps.Une variable supplémentaire
j
est conservée, représentant2*i+1
. L'auteur fait de même dans l'implémentation de référence. Le calculn
séparé est beaucoup plus simple (et moins obscur), car il utilise les valeurs actuelles deq
,r
ett
, plutôt que la suivante.Le chèque
n == q/s
est certes assez laxiste. Cela devrait liren == (q*(k+2*j+4)+r)/(s*(k+2*j+4)+t)
, oùj
est2*i-1
etk
esti*i
. Aux itérations supérieures, les termesr
ett
deviennent de moins en moins significatifs. En l'état, c'est bon pour les 100 000 premiers chiffres, donc c'est probablement bon pour tous. L'auteur ne fournit aucune implémentation de référence.L'auteur suppose qu'il est inutile de vérifier que
n
cela ne changera pas dans les itérations suivantes, et qu'il ne sert qu'à ralentir l'algorithme. Bien que cela soit probablement vrai, le générateur conserve environ 13% de chiffres corrects de plus qu'il n'en a actuellement généré, ce qui semble quelque peu inutile. J'ai ajouté la vérification et attendez que 50 chiffres soient corrects, en les générant tous en même temps, avec un gain notable de performances.Calculé comme
Malheureusement,
s
ne met pas à zéro, en raison de la composition initiale (3528 ÷), mais il est toujours beaucoup plus rapide que g3. La convergence est d'environ 5,89 chiffres par trimestre, 3511 chiffres sont générés à la fois. Si c'est un peu trop, générer 271 chiffres pour 46 itérations est également un choix décent.Timings
Pris sur mon système, à des fins de comparaison uniquement. Les heures sont répertoriées en secondes. Si un chronométrage a duré plus de 10 minutes, je n'ai effectué aucun autre test.
Il est intéressant de noter qu'il
g2
finit par dépasserg3
, malgré un taux de convergence plus lent. Je soupçonne que c'est parce que les opérandes se développent à un rythme beaucoup plus lent, gagnant à long terme. L'implmentation la plus rapideg4_md
est environ 235x plus rapide que l'g3_ref
implmentation sur 500 000 chiffres. Cela dit, il y a encore des frais généraux importants pour diffuser des chiffres de cette manière. Le calcul direct de tous les chiffres à l'aide de Ramanujan 39 ( source python ) est environ 10 fois plus rapide.Pourquoi pas Chudnovsky?
L'algorithme Chudnovsky nécessite une racine carrée de haute précision, dans laquelle je ne suis honnêtement pas sûr de savoir comment travailler - en supposant que ce soit le cas. Le Ramanujan 39 est quelque peu spécial à cet égard. Cependant, la méthode semble être propice à des formules de type Machin, telles que celles utilisées par y-cruncher, ce qui pourrait être une avenue à explorer.
la source
Haskell, 231 octets
Celui-ci utilise les algorithmes Spigot illimités pour les chiffres de Pi de Jeremy Gibbons, 2004. Le résultat est
p
. Techniquement, il devrait prendre en charge des séquences de sortie infinies, mais cela peut prendre un certain temps (et est limité par votre mémoire).la source
Python 2, 298 octets
Notez que le code pour générer pi est tiré de l'implémentation de l'OP.
Ma première tentative de golf en Python. Sort la séquence pour toujours.
la source
π
ici? Vous calculez bien sûr pi, non?π
pour toujours là-bas?yield
qui l'arrête, mais je ne suis pas très bon en pythonp
partiePython 3.5,
278263 octets:Cela prend en
n
entrée les premiersn
chiffres deπ
, puis sort les membres de la séquence dans ces premiersn
chiffres. Maintenant, cela utilise le module décimal intégré de Python pour aller au-delà des limitations en virgule flottante de Python, puis définit la précision, ou epsilon, pour autant les entrées utilisateur. Ensuite, pour calculerπ
, cela passe par 50 itérations en utilisant l' algorithme efficace de Gausse-Legendre , puisque l'algorithme double apparemment le nombre de chiffres corrects à chaque fois, et donc, en 50 itérations, nous pouvons obtenir2^50
ou1,125,899,906,842,624
corriger les chiffres. Enfin, une fois les calculs effectués, il utilise une expression régulière avec un format de chaîne dans unewhile
boucle pour rechercher et imprimerre
faire correspondre les objets (que j'espère bien) pour tous les chiffres continus et récurrents 1 chiffre de plus que lors de l'itération précédente dans la boucle.J'ai pu utiliser cet algorithme pour calculer avec succès et précision
π
jusqu'à10,000,000
(dix millions) de chiffres, ce qui a pris environ 4 heures et 12 minutes. Voici le résultat final:Donc, je peux dire avec confiance que le 8e numéro de la séquence ne se produit même pas dans les 10 premiers millions de chiffres!
π
est un nombre aléatoire ...la source