Il suffit d’écrire sur la ligne d’édition de son navigateur avec Google:
google gemini
(je mentionne google pour ne pas confondre avec autre chose, comme la mission Gemini de la NASA)
J’ai d’abord fait des tests simples tels que:
- Trouver la somme des nombres de 1 à 100 (je connais la formule, mais le code était correct)
- Trouver les nombres premiers de 1 à 100 avec l’algorithme du crible d’Ératosthène.
J’ai explicitement demandé d’écrire la solution en Python.
Je me dis que si l’exécution prend beaucoup de temps, c’est en grande partie parce que l’algorithme n’est pas le meilleur.
Je me suis ensuite attaqué au problème 93 sur le site Défi Turing que je n’avais pas encore résolu, je l’avoue.
Voici l’énoncé:
Il est possible d’écrire 10 comme une somme de nombres premiers de cinq manières exactement :
7 + 3
5 + 5
5 + 3 + 2
3 + 3 + 2 + 2
2 + 2 + 2 + 2 + 2
Quel est le plus petit entier qui peut s’écrire comme une somme de nombres premiers de plus d’un million de manières différentes ?
Gemini m’a fourni une solution qui donne la bonne réponse (le site vérifie si notre réponse est correcte).
De plus, mon code s’exécute en 13 milli-secondes sur mon ordinateur. Un autre utilisateur a écrit son code en Rust et son code s’exécute en 5 milli-secondes sur son ordinateur.
Je n’ai pas analysé son code.
Mon expérience comparative de ces deux langages me laisse croire que le code de Gemini pourrait s’exécuter en moins de la milli-seconde en Rust sur mon ordinateur.
(peut-être 500 à 700 micro-secondes).
Voici le code généré par Gemini:
(j’ai ajouté le code pour calculer le temps d’exécution)
from time import perf_counter
def nombres_premiers(n):
"""Retourne une liste de nombres premiers inférieurs ou égaux à n."""
premiers = [True] * (n + 1)
premiers[0] = premiers[1] = False
for i in range(2, int(n**0.5) + 1):
if premiers[i]:
for j in range(i * i, n + 1, i):
premiers[j] = False
return [i for i, est_premier in enumerate(premiers) if est_premier]
def nombre_de_sommes_premiers(n, premiers):
"""Calcule le nombre de façons dont n peut être écrit comme une somme de nombres premiers."""
dp = [0] * (n + 1)
dp[0] = 1
for premier in premiers:
for i in range(premier, n + 1):
dp[i] += dp[i - premier]
return dp[n]
def trouver_entier_million_sommes():
"""Trouve le plus petit entier qui peut être écrit comme une somme de nombres premiers de plus d'un million de façons."""
n = 2
while True:
premiers = nombres_premiers(n)
if nombre_de_sommes_premiers(n, premiers) > 1000000:
return n
n += 1
depart = perf_counter()
resultat = trouver_entier_million_sommes()
print(round(perf_counter() - depart, 3), "secondes")
print(f"Le plus petit entier qui peut être écrit comme une somme de nombres premiers de plus d'un million de façons est : {resultat}")
De plus Gemini donne des explications sur la signification ou l’utilité des différentes fonctions.
Dans les cas simples, il donne une explication soit de l’algorithme ou soit du code.
Je n’ai pas encore cherché à l’optimisé. Ce n’est pas si mauvais pour du code généré automatiquement par une IA.