[PYTHON] À propos de la fraction approximative du rapport de circonférence

Pi

Pi. C'est un grand nombre plein de charme et de mystère qui n'est qu'une constante mais pas seulement une constante. Ce n'est pas facile à prouver, mais n'est-ce pas le nombre irrationnel et transcendantal le plus familier?

Valeur de circonférence

Il y a une histoire qui a été recherchée de diverses manières. Comme cela n'a rien à voir avec cet article, je n'expliquerai pas la méthode spécifique, mais même avec un ordinateur portable normal, s'il s'agit d'une spécification moderne, vous pouvez facilement trouver environ 100 chiffres (en secondes). La théorie des raisons pour lesquelles il est nécessaire est généralement difficile, mais c'est facile si vous acceptez la méthode de calcul. Je mentionnerai la valeur pour le moment π = 3,141592653589 793238462643 383279502884 197169399375 105820974944 592307816406 286208998628 034825342117 067982148086 513282306647 ... et ainsi de suite.

Fraction approximative de circonférence

Quelle est la fraction approximative de ce sujet? C'est une histoire. Si vous voulez le faire strictement, vous devez penser à la densité de nombres réels (nombres rationnels et irrationnels) que vous étudiez en mathématiques universitaires, mais vous pouvez simplement l'expliquer intuitivement.

Tout d'abord, le rapport de circonférence est un nombre déraisonnable. Je l'admets également. Je ne sais pas si c'est complètement aléatoire. Le nombre au nième chiffre est dit aléatoire. Par contre, pour les nombres rationnels, où apparaît toujours la boucle? 1 ÷ 6 = 0,666 ... et 6 boucles, et 123 ÷ 999 = 0,123123123 ... et 123 boucles. Vous pouvez également écrire 6 ÷ 2 comme 6 ÷ 2 = 3 = 2.999 ..., donc même s'il est divisible, une boucle apparaîtra. La présence ou l'absence de boucles est l'une des principales différences entre les nombres rationnels et irrationnels. De cette façon, c'est un nombre qui est complètement différent du nombre rationnel et du nombre irrationnel, mais il est possible de créer un nombre rationnel aussi proche que possible du nombre rationnel appelé le rapport de circonférence. Je dis parfois «dense» avec des mots difficiles, mais pour l'expliquer grossièrement, la suite de nombres rationnels An

A_1=3, \quad A_2=3.1, \quad A_3=3.14,\quad ...

Si vous décidez, la limite de cette séquence de nombres correspondra au rapport de circonférence. Cela semble étrange pour un moment quand on dit que la limite est la même qu'un nombre déraisonnable même si seuls les nombres rationnels apparaissent, mais c'est intuitivement convaincant. Je me demande si.

Après tout, vous pouvez créer des fractions aussi proches du ratio de circonférence que vous le souhaitez.

Faits intéressants

Considérons le problème suivant ici

\text{ensemble$F_n$Est défini comme suit.}\\
F_n:=\{a/b\mid b\neq 0,\quad 0 \leq a,b \leq 10^n-1,\quad a,b\in \mathbb{Z} \}

Et. En ce moment,

F_n\text{La plupart sous}\pi\text{Ce qui est proche de?}

En d'autres termes

F_1\text{Est un ensemble de nombres qui peuvent être faits de 1 ÷ 1 à 9 ÷ 9}
F_2\text{Est un ensemble qui peut être fait de 1 ÷ 1 à 99 ÷ 99.}

Alors, quelle est la fraction la plus proche du rapport de circonférence qui limite le nombre de chiffres dans la molécule du dénominateur? Appelons cela p (n).

Et les faits suivants sont connus.

\begin{align*}
p(1)&=3/1\\
p(2)&=22/7\\
p(3)&=355/113\\
p(4)&=355/113=p(3)
\end{align*}

En d'autres termes, 355/113 est une approximation extrêmement précise !! C'est un fait très intéressant personnellement, car vous pouvez utiliser jusqu'à 4 chiffres dans le dénominateur, mais 3 ÷ 3 chiffres est une fraction précise. Cependant, le simple fait de le savoir comme un fait m'a fait me demander: "Vraiment?" Puis le programme entre en jeu. Faisons une recherche à tour de rôle avec le programme.

Considération avant de faire un programme

Cette fois, nous vérifierons jusqu'à 4 chiffres / 4 chiffres, donc le montant du calcul par tour est d'environ 10000 * 10000 = 10 ^ 8 Si tel est le cas, vous pouvez le vérifier par round robin, mais vous voudrez peut-être demander p (8) à l'avenir, alors imaginons un moyen d'omettre certains calculs.

Ingéniosité 1: commencez à rechercher des molécules à partir du dénominateur * 3 Ingéniosité 2. Insérez une action pour arrêter au milieu Je pense que cela seul réduira considérablement la quantité de calcul, donc je vais l'implémenter avec ça!

programme

Étant donné que la capacité du programme est extrêmement insuffisante, je l'écrirai honnêtement.

pi=3.141592653589793#Je me demande si cela suffit

n=int(input())
check=((10**n)-1)//3
ans=100
ans_list=[100,1]
for i in range(1,check+1):#C'est le dénominateur
    for j in range(3*i,(10**n)):
        frac=j/i
        if abs(frac-pi)<abs(pi-ans):
            ans=frac
            ans_list=[j,i]
        else:
            if frac>ans:
                break
print(ans)
print(ans_list)

Résultat d'exécution

1
>>>3.0
>>>[3, 1]

2
>>>3.142857142857143
>>>[22, 7]

3
>>>3.1415929203539825
>>>[355, 113]

4
>>>3.1415929203539825
>>>[355, 113]

5
>>>3.1415926415926414
>>>[99733, 31746]

Même avec 4 chiffres ÷ 4 chiffres, 355/113 est vraiment le plus fort.

Résumé ludique

355/113 est un grand nombre. Au fait, le mot de passe de mon iPhone était le 355113 il y a longtemps.

Résumé sérieux

C'est assez lent autour de n = 5, donc j'apprécierais que quelqu'un puisse l'améliorer.

Postscript

Il y a math.pi en maths, alors je pense que tout va bien.

import time
import math

n=int(input())
start=time.time()
pi=math.pi
check=((10**n)-1)//3
ans=100
ans_list=[100,1]

for i in range(1,check+1):#C'est le dénominateur
    for j in range(int((pi)*i),(10**n)):
        frac=j/i
        if abs(frac-pi)<abs(pi-ans):
            ans=frac
            ans_list=[j,i]
        else:
            if frac>ans:
                break
print(ans)
print(ans_list)
end=time.time()
print(end-start)

C'est devenu si rapide que j'ai demandé p (8)

6
>>>3.141592653581078
>>>[833719, 265381]

7
>>>3.1415926535898153
>>>[5419351, 1725033]

8
>>>3.1415926535897927
>>>[80143857, 25510582]

Je sens que le mystère de nombreuses années a été résolu.

Recommended Posts

À propos de la fraction approximative du rapport de circonférence
À propos de la fraction approximative du rapport de circonférence
À propos de tout numpy
À propos de l'attribution de numpy.ndarray
À propos de MultiIndex of Pandas
À propos de la variable du chainer
Affichage des fractions (liste)
À propos de max_iter de LogisticRegression () de scikit-learn
À propos du support japonais de cometchat
À propos de divers encodages de Python 3
À propos de tout numpy (2e)
À propos du calcul des coûts de MeCab
À propos des composants de Luigi
À propos de la sortie HOG de Scikit-Image
À propos des fonctionnalités de Python
À propos de la gestion des données d'Anvil-App-Server
À propos de la valeur de retour de pthread_mutex_init ()
À propos de la valeur de retour de l'histogramme.
À propos du type de base de Go
À propos de la limite supérieure de threads-max
À propos du croisement circulaire d'algorithmes génétiques
À propos du comportement de yield_per de SqlAlchemy
À propos de l'erreur d'importation de PyQt5.QtWidgets (Anaconda)
À propos de la taille des points dans matplotlib
À propos du traitement des demi-teintes couleur des images
À propos de la liste de base des bases de Python