Programmation fonctionnelle dans Python Project Euler 3

Problem 3 - Project Euler

"Facteur premier maximum"

Les facteurs premiers de 13195 sont 5, 7, 13, 29.

Trouvez le plus grand des facteurs premiers de 600851475143.

Solution

Commencez par 2 et recherchez les facteurs dans l'ordre croissant, puis répétez récursivement le processus de division par la valeur chaque fois qu'un facteur est trouvé pour trouver le plus grand facteur premier. Nous utilisons une technique fonctionnelle pour trouver le premier élément qui correspond à la condition selon laquelle l'entier reçu en argument est divisible.

Fonction pour trouver le premier élément

Je pense qu'il est normal que les langages fonctionnels aient une fonction qui trouve le premier élément qui correspond à une condition donnée.

Langue Nom de la fonction
F# find
Scala find
C# (LINQ) First
Java 8 -

Il n'y a pas de fonction similaire en Python, vous devez donc combiner des fonctions existantes. Vous pouvez obtenir le premier élément en générant un itérateur qui ne renvoie que ceux qui remplissent les conditions avec la fonction de filtre et en passant cet itérateur à la fonction suivante.

def find(condition, iterable):
    return next(filter(condition, iterable), None)

Dans la définition de fonction ci-dessus, condition est la fonction qui détermine la condition, iterable est un objet tel qu'une liste, et le dernier None est la valeur renvoyée lorsqu'il n'y a pas d'élément.

Exemple de réponse

Python_3.x


# -*- coding: UTF-8 -*-
from math import sqrt


def find(pred, iterable):
    '''Trouvez le premier élément qui correspond aux critères. Renvoie None s'il n'y a pas d'éléments correspondants.'''
    return next(filter(pred, iterable), None)


def getMaxPrimeFactor(n):
    '''Trouvez le facteur premier maximum.'''
    #️ Trouvez le plus petit facteur compris entre 2 et √n.
    limit = int(sqrt(n))
    smallestFactor = find(lambda i: n % i == 0, range(2, limit + 1))
    if smallestFactor is None:
        #Renvoie n si aucun facteur n'est trouvé.
        return n
    else:
        #️ Si un facteur est trouvé, appelez récursivement en divisant n par le facteur.
        return getMaxPrimeFactor(n // smallestFactor)


answer = getMaxPrimeFactor(600851475143)
print(answer)

Si vous l'exécutez avec Python 2.x, une erreur se produira, vous pouvez donc l'exécuter correctement en remplaçant la fonction de filtre par la fonction ifilter du module itertools.

Python_2.x


# -*- coding: UTF-8 -*-
from math import sqrt
from itertools import ifilter


def find(pred, iterable):
    '''Trouvez le premier élément qui correspond aux critères. Renvoie None s'il n'y a pas d'éléments correspondants.'''
    return next(ifilter(pred, iterable), None)


def getMaxPrimeFactor(n):
    '''Trouvez le facteur premier maximum.'''
    #️ Trouvez le plus petit facteur compris entre 2 et √n.
    limit = int(sqrt(n))
    smallestFactor = find(lambda i: n % i == 0, range(2, limit + 1))
    if smallestFactor is None:
        #Renvoie n si aucun facteur n'est trouvé.
        return n
    else:
        #️ Si un facteur est trouvé, appelez récursivement en divisant n par le facteur.
        return getMaxPrimeFactor(n // smallestFactor)


answer = getMaxPrimeFactor(600851475143)
print(answer)

Recommended Posts

Programmation fonctionnelle dans Python Project Euler 1
Programmation fonctionnelle dans Python Project Euler 3
Programmation fonctionnelle dans Python Project Euler 2
[Note] Projet Euler en Python (problème 1-22)
Projet Euler # 5 "Minimum Multiple" en Python
Programmation avec Python
Projet Euler # 15 "Lattice Path" en Python
Projet Euler # 4 "Calligraphie maximum" en Python
Projet Euler # 3 "Maximum Prime Factors" en Python
Projet Euler # 11 "Produit maximum dans la grille" en Python
Projet Euler # 7 "1000 1er nombre premier" en Python
Projet Euler # 16 "Somme des pouvoirs" en Python
Projet Euler # 9 "Numéro spécial Pitagolas" en Python
Projet Euler # 14 "Colonne de nombre de collats la plus longue" en Python
Essayez un tube de programmation fonctionnel en Python
Projet Euler # 2 "Even Fibonacci Number" en Python
Projet Euler # 17 "Nombre de caractères" en Python
Projet Euler # 1 "Multiple de 3 et 5" en Python
Programmation Python avec Excel
Qu'est-ce que la «programmation fonctionnelle» et «orientée objet»? Édition Python
Projet Euler # 10 "somme des nombres premiers" en Python
Projet Euler n ° 12 "Triangles hautement ajustés" en Python
Projet Euler # 13 "Somme des grands nombres" en Python
Projet Euler # 6 "Différence de somme des carrés" en Python
Entrez en contact avec la programmation fonctionnelle en JavaScript ou Python 3
Projet Euler 37
Projet Euler 7
Projet Euler 47
Projet Euler 31
Projet Euler 4
Projet Euler 38
Projet Euler 17
Projet Euler 26
Projet Euler 8
Projet Euler 23
Projet Euler 22
Projet Euler 19
Projet Euler 50
Projet Euler 42
Projet Euler 33
Projet Euler 32
Projet Euler 43
Projet Euler 35
Projet Euler 36
Projet Euler 24
Projet Euler 46
Projet Euler 48
Projet Euler 45
Projet Euler 6
Projet Euler 44
Créer une documentation de projet Python dans Sphinx
Projet Euler 39
Projet Euler 40
Projet Euler 49
Projet Euler 29
Projet Euler 27
Projet Euler 41
Projet Euler 18
Projet Euler 11 "Produit maximum dans la grille"
Projet Euler 13
Projet Euler 30