Pi fois e (ou Pie si vous aimez la notation ambiguë) à 100 décimales est:
8.5397342226735670654635508695465744950348885357651149618796011301792286111573308075725638697104739439...
( OIES A019609 ) ( argument pour une possible irrationalité )
Votre tâche consiste à écrire un programme qui accepte un entier positif N et génère Pi * e tronqué à N décimales. par exemple, si N = 2, alors la sortie devrait être 8.53
.
Ceci est un problème d'optimisation, donc la soumission qui peut donner la sortie correcte pour la valeur la plus élevée de N gagnera.
Pour garantir que toutes les soumissions sont jugées en utilisant la même puissance de calcul, votre code doit être exécuté sur ideone , dans n'importe quelle langue prise en charge. Selon la FAQ ideone , il y a une limite de 5 secondes pour les utilisateurs non connectés. Cette limite de 5 secondes est celle que vous devez utiliser, pas la limite de 15 secondes pour les utilisateurs connectés. (Voir la FAQ pour d'autres limites comme la mémoire, la taille du code, etc.)
Plus précisément, toute personne non connectée à ideone devrait pouvoir exécuter votre programme sur ideone pour toutes les valeurs de N de 1 à un certain Nmax maximum, et voir la sortie correcte presque tout le temps . sans aucune erreur Time limit exceeded
ou Memory limit exceeded
, etc. La soumission avec le plus grand Nmax gagne.
(Que le temps réel pris soit un peu plus de 5 secondes n'a pas d'importance tant que l'idéone ne donne pas d'erreurs. " Presque tout le temps " est défini comme plus de 95% du temps pour un N. particulier)
Détails
- Vous pouvez utiliser n'importe quelle méthode mathématique que vous aimez pour calculer Pi * e, mais vous ne pouvez pas coder en dur la sortie au-delà des douze premiers chiffres de Pi, e ou Pi * e .
- Votre programme devrait pouvoir fonctionner pour n'importe quel N, avec des ressources illimitées.
- Vous pouvez utiliser des constantes Pi ou e intégrées si votre langue les possède.
- Vous ne pouvez pas accéder à des sites Web ou à des ressources externes à votre code (si ideone le permet même).
- Au-delà du codage en dur et de l'accès aux ressources externes, tout ce que l'idéone permet est presque certainement bien.
- Vos entrées et sorties doivent (évidemment) fonctionner avec tout ce que l'ideone fournit pour les E / S (stdin / stdout seulement il semble). C'est bien si vous avez besoin de guillemets autour de l'entrée N ou la sortie est quelque chose comme
ans = ...
, etc. - Veuillez inclure un lien vers un extrait idéone de votre code avec votre Nmax en entrée.
- S'il se trouve qu'il y a égalité (uniquement si plusieurs soumissions atteignent la limite de 64 Ko de caractères de sortie), la réponse la plus élevée gagne.
la source
Réponses:
Python - 65535
http://ideone.com/knKRhn
Ideone ne semble pas avoir
gmpy2
installé, ce qui est regrettable pour au moins deux raisons. Un, car cela rendrait la calcification beaucoup plus rapide, et deux, car il rend impossible toute formule nécessitant une racine carrée de précision arbitraire.La formule que j'utilise pour π a été répertoriée par Ramanujan comme formule (39):
qui converge au taux de ~ 5,89 chiffres par trimestre. À ma connaissance, il s'agit de la série convergente la plus rapide du genre qui ne nécessite pas l'évaluation d'une racine carrée de précision arbitraire. Formule (44) dans le même papier (taux de convergence ~ 7.98 chiffres par trimestre) est le plus souvent appelée la formule Ramanujan.
La formule que j'utilise pour e est la somme des factorielles inverses. Le nombre de termes requis est calculé comme Γ -1 ( 10 n ), en utilisant une approximation que j'ai trouvée sur mathoverflow . Le composant Lambert W 0 est trouvé en utilisant la méthode de Newton.
Le calcul de chacune de ces sommations se fait via l' évaluation rapide de la fonction E (plus généralement connue sous le nom de division binaire), conçue à l'origine par Karatsuba. La méthode réduit une sommation à n termes à une seule valeur rationnelle p / q . Ces deux valeurs sont ensuite multipliées pour produire le résultat final.
Mise à jour: Le
profilage a révélé que plus de la moitié du temps nécessaire au calcul a été passé dans la division finale. Seuls les bits logarithmiques supérieurs de 2 (10 n ) de q sont nécessaires pour obtenir une précision totale, donc j'en coupe quelques-uns au préalable. Le code remplit désormais le tampon de sortie Ideone en 3,33 s .
Mise à jour 2:
Comme il s'agit d'un défi d' optimisation , j'ai décidé d'écrire ma propre routine de division pour lutter contre la lenteur de CPython. La mise en œuvre de ce qui
divnr
précède utilise la division Newton-Raphson . L'idée générale est de calculer d = 1 / q · 2 n en utilisant la méthode de Newton, où n est le nombre de bits requis par le résultat, et de calculer le résultat comme p · d >> n . Le temps d'exécution est maintenant de 2,87 s - et cela sans même couper les bits avant le calcul; c'est inutile pour cette méthode.la source
PARI / GP: 33000
Il s'agit essentiellement du programme donné à OEIS , modifié pour prendre correctement les entrées et formater les sorties. Il devrait servir de référence à battre, si rien d'autre.
Je suppose que c'est exact. Je l'ai vérifié à 100 et 20 km contre OEIS, et il correspondait aux deux. Il est assez difficile de trouver d'autres chiffres en ligne pour vérifier.
Pour 33 000, cela prend environ 4,5 secondes, donc il pourrait probablement être légèrement heurté. Je me suis juste lassé de tripoter l'entrée et la boucle de soumission / compilation / exécution lente d'idéone.
Lien Ideone.com
la source
Str(floor(frac(x)*10^m)
cela va des centaines / milliers de fois plus vite.Python 3
Puisque les pi et e intégrés n'ont pas assez de chiffres, j'ai décidé de calculer les miens.
Lien IDEOne
Sortie pour STDIN = 1000:
la source
should be able to work for any N, given unlimited resources
règle. La plupart des sorties sont des zéros à environ N = 10000.)NameError: name 'xrange' not defined
.Scala - 1790
IDEOne sur http://ideone.com/A2CIto .
Nous utilisons la formule de Wetherfield pour π (et le code de la formule de Machin grossièrement porté à partir d' ici ). Nous calculons e en utilisant la série de puissance ordinaire.
la source