il contient une fonction pgcd, ppcm, diviseurs (renvoyant les diviseurs d'un nombre), quotient (liste de tous les quotients de l'algorithme d'Euclide), un test de primalité, une fonction renvoyant un couple (u,v) résolvant au+bv=1 et une fonction résolvant toutes les équations diophantiennes linéaires résolvables (celles vu au lycée), donc bien pratique pour la terminale S
il s'appelle arithmetique.py
- Code: Select all
from math import*
def isprime(n):
if type(n)!=int or n<2: #test pour vérifier si n correspond bien à ce qu'on attend de lui. Il y en a beaucoup dans le script, souvent inutile mais au cas où :p
return False
for i in range(2,int(n**0.5)+1):
if n%i==0:
return False
return True
def diviseurs(n):
if type(n)!=int or n<1:
return None
if n==1:
return [1]
liste=[1]
for i in range(2,int(n**0.5)+1):
if n%i==0:
liste.append(i)
if n//i!=i: #pour tester si i²!=n, sans ce test pour un carré on aurait deux fois la racine
liste.append(n//i)
return liste+[n]
def pgcd(a,b):
if type(a+b)!=int:
return None
while b!=0:
a,b=b,a%b
return abs(a)
def ppcm(a,b):
if type(a+b)!=int:
return None
return a*b//pgcd(a,b)
def quotient(a,b):
if type(a+b)!=int:
return None
liste=[]
while b!=0:
liste.append(a//b)
a,b=b,a%b
return liste
def bezout(a,b):
if pgcd(a,b)!=1:
return None
if abs(a)<abs(b):
a,b=b,a #u multiplie le max(a,b), ceci m'évite donc de faire cas par cas...
liste_q=quotient(abs(a),abs(b))
liste_u=[0]*len(liste_q)
del liste_q[len(liste_q)-1] #dans le prochain algorithme pour trouver u, on ne veut pas le quotient du reste nul
liste_u[1]=1
u=0
c=1
for i in liste_q[1:]:
liste_u[c+1]=-i*liste_u[c]+liste_u[c-1] #je ne sias pas pourquoi ça marche mais ça marche
c+=1
u=liste_u[-1]
if a<0:
u*=-1
v=(-a*u+1)//b
print(a,"*",u,"+",b,"*",v,"=1")
return u,v
def diophant(a,b,c): #pour résoudre ax+by=c
if type(a+b)!=int:
return None
d=pgcd(a,b)
if pgcd(d,c)==d:
if abs(a)<abs(b):
a,b=b,a
e,f,g=a//d,b//d,c//d
else:
return None
u,v=bezout(e,f)
print("(",u*g,"+",f,"k)*",a,"+","(",v*g,"-",e,"k)*",b,"=",c)
la fonction diophant n'est pas parfaite, pour diophant(17,-23,5), elle affiche ( -15 + 17 k)* -23 + ( -20 - - 23 k)* 17 = 5
le résultat est juste si on remplace - - par +
Ce script permet de combler l’absence de fonctions très pratiques absentes dans la version 1.3