[PYTHON] Générateur de nombres naturels

C'est un nombre naturel que j'utilise avec désinvolture, mais il doit être strictement défini pour pouvoir le gérer en mathématiques. Cette fois, je vais vous montrer comment faire. Voici une question de préférence personnelle, mais les nombres naturels commencent à 0 $.

Comment faire des nombres naturels

Les nombres naturels commencent à 0 $ (ou 1 $) et ont la propriété d'être infinis et en ligne. Bien sûr, il ne se casse, ne se branche ou ne fusionne nulle part. Les propriétés que ces nombres naturels doivent satisfaire sont définies par «l'axiome de Pearno». Concernant l'affirmation de Peano, je pense que ce serait bien si vous pouviez vous référer à "Belle histoire de mathématiques au lycée: Qu'est-ce qu'un nombre naturel (peut inclure 0)". Il est également discuté en détail et d'une manière facile à comprendre dans "Théorème de l'incomplétude de Mathematics Girl Goetel".

Cependant, l'axiome de Peano ne mentionne que la condition d'être un nombre naturel. Il n'y a pas de problème avec cela, mais l'un des algorithmes qui définit formellement ceux qui satisfont à ces conditions, c'est-à-dire donne une substance aux nombres naturels, est la "méthode de construction de Neuman". Pour reprendre les mots d'un ingénieur, est-ce une image de définition des exigences en nombres naturels en utilisant l'axiome de Peano et en codant avec la méthode de construction de Neumann? La méthode de construction de Neumann utilise des ensembles (quelque chose comme {1, 2, 3}) pour générer quelque chose qui satisfait l'agenda de Peano.

Dans la méthode de construction de Neumann, $ 0 $ est le premier nombre naturel, et le nombre naturel est défini comme suit.

\begin{eqnarray}
0 &:=& \{\} \\
1 &:=& \{0\} = \{\{\}\} \\
2 &:=& \{1,\ 0\} = \{\{\{\}\},\ \{\}\} \\
3 &:=& \{2,\ 1,\ 0\} = \{\{\{\{\}\},\ \{\}\},\ \{\{\}\},\ \{\}\}
\end{eqnarray}

Après cela, il est répété.

Disposition des algorithmes

Créez un algorithme qui définit les nombres naturels selon la méthode de construction de Neumann. L'objectif est de créer un programme qui génère la définition sous forme de chaîne de caractères standard lorsqu'un entier de 0 $ ou plus est entré.

Dans la méthode de construction de Neumann, 0 = {} est d'abord défini, puis défini de manière récursive en utilisant uniquement les nombres naturels déjà définis. En fin de compte, les nombres naturels ne sont représentés que par trois types de caractères: {, }, ,. Je vais mettre un diagramme d'image.

algorism.PNG

Tout ce que vous avez à faire est de sortir ce caractère par caractère à partir de la gauche.

la mise en oeuvre

Cliquez ici pour le code source. J'utilise python 3.7.

natural_number_generator.py


import sys


#Générateur de nombres naturels
def neumann_algorithm(target_num: int):
    processing = target_num - 1
    yield '{'

    while processing >= -1:
        # (1)
        if processing == -1:
            yield '}'
            return 0
        else:
            natural_number_generator = neumann_algorithm(processing)
            yield from natural_number_generator
        
        # (2)
        if processing == 0:
            yield '}'
            return 0
        else:
            yield ', '
        
        processing -= 1

    return 0


#Obtenir la valeur d'entrée
def get_input_num():
    args = sys.argv
    input_num = int(args[1])

    return input_num


if __name__ == "__main__":
    target_num = get_input_num()

    natural_number_generator = neumann_algorithm(target_num)
    for char in natural_number_generator:
        print(char, end='')

Explication du code source

La fonction neumann_algorithm dans le code source est l'algorithme qui génère des nombres naturels. À l'intérieur de la fonction, il y a deux branches, (1) et (2) (voir les commentaires dans le code source). Je vais y mettre une brève explication.

algorism_explain.PNG

(1) est la partie qui détermine si la valeur à sortir à partir de maintenant est $ 0 $, c'est-à-dire si elle est définie ou non. Puisque 0 = {} est défini en premier, vous pouvez afficher {} directement, mais comme les autres nombres ne sont pas définis, vous devez appeler la fonction de manière récursive.

(2) est la partie qui détermine s'il faut afficher } ou , chaque fois qu'un processus de redémarrage est terminé.

La définition d'un nombre naturel devient explosive tant que le nombre augmente (environ $ O (2 ^ n) $) **. Par conséquent, si vous le réveillez avec une chaîne ou une liste, vous risquez de manquer de mémoire. Pour éviter cela, nous l'avons implémenté à l'aide d'un générateur qui peut juger chaque caractère à sortir et le rejeter lorsqu'il n'est plus nécessaire. Si vous souhaitez l'exécuter, nous vous recommandons d'attendre environ 10 $.

Résultat de sortie

Voici le résultat de la saisie de $ 0 $ à $ 5 $ et de son exécution.

>python natural_number_generator.py 0
{}
>python natural_number_generator.py 1
{{}}
>python natural_number_generator.py 2
{{{}}, {}}
>python natural_number_generator.py 3
{{{{}}, {}}, {{}}, {}}
>python natural_number_generator.py 4
{{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}
>python natural_number_generator.py 5
{{{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}
>

C'est un sentiment agréable.

Au fait, j'ai remarqué quand je l'ai déplacé, mais il semble que «}» ne continue pas plus de 3 fois. Cela ressort clairement du mode de branchement, mais je n'en étais pas conscient au stade de la réflexion sur l'algorithme. Vous avez fait une nouvelle découverte.

prime

La définition de 10 $.

>python natural_number_generator.py 10
{{{{{{{{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}, {{{{}}, {}}, {{}}, {}}, {{{}}, {}}, {{}}, {}}
>

c'est tout. Merci beaucoup.

Recommended Posts

Générateur de nombres naturels
Module aléatoire de Numpy Génération aléatoire
Générateur
Générateur
générateur de nombres aléatoires français avec python
Générateur principal infini en Python3
nombre premier
Tri naturel
Mémo du générateur.
Générateur aléatoire qui suit la distribution normale N (0,1)
Numéro de base