Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#126 20-07-2014 15:29:22
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
Et pour ce qui est de classer les triangles par aires décroissantes j'ai essayé ton astuce de mettre 'reverse=True', comment se fait-il que ça ne marche pas?
Quant aux écarts négatifs qui n'apparaissent pas: tu as une idée?
Observation: les deux dernières décimales de l'écart ne sont encore généralement pas exactes.
@+
Hors ligne
#127 20-07-2014 15:29:45
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
Pour le choix n°2, ton affichage sera perturbé si
- tes périmètres sont > 999
- tes longueurs AC,BC,AB,AM,BM sont > 999 (là pour le choix 1 aussi)
Donc, je retire un espace quelque part et j'en ajoute un à l'affichage du périmètre (c'est tout ce que je rectifie) :
devient :
Bon tu peux toujours élargir la fenêtre à la souris au besoin ou modifier la config pour que la fenêtre soit toujours large de 90 caractères et non 80 par défaut...
@+
En ligne
#128 20-07-2014 19:47:04
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Ave,
Ne te serais-tu pas tenté par une implémentation de 2 options supplémentaires :
* La recherche des triangles exclusivement isocèles ayant un (ou des) point(s) intérieur(s) à distances entières des sommets
* La recherche des triangles équilatéraux ayant un (ou des) point(s) intérieur(s) à distances entières des sommets
Je viens de voir ta question...
Après toutes ces modifs/simplifications, nj'ai dû supprimer ou oublier qq ch (les aires était à 0) : je cherche...
J'ai rétabli un certain nombre de choses, une m'échappe encore.
Je remettrai le code une fois corrigé...
@+
En ligne
#129 20-07-2014 20:57:13
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
# -*- coding: UTF-8 -*-
from math import sqrt
from operator import itemgetter
from decimal import *
D=Decimal
getcontext().prec=25
def sqD(x):
#Calcul de la racine carrée de x
# D'après [url]http://python.jpvweb.com/mesrecettespython/doku.php?id=math_decimal[/url]
if type(x)!=type(Decimal):
x = D(str(x))
return x.sqrt()
def MinMax():
print (" +++ Choix des périmètres mini et maxi +++\n")
while 1:
mini=input("Perimètre minimim souhaité ? ")
try:
minp=int(mini)
break
except ValueError:
print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")
while 1:
maxi=input("Perimètre maximum souhaité ? ")
try:
maxp=int(maxi)+1
if maxp<=minp:
print ("Erreur,le maximum doit être supérieur au mini. Veuillez recommencer S.V.P..\n\n")
else:
break
except ValueError:
print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")
print("\n\n")
return minp,maxp
def ChoixLimiteSuperieure():
print ("\n +++ Choix de la limite supérieure +++\n")
while 1:
nn=input("Limite supérieure souhaitée entre 1 et 15 ? ")
try:
n=int(nn)
if n>0 and n<16:
break
else:
print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")
except ValueError:
print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")
return n
def Generation_des_Triangles(minp,maxp,Trg,Dico,chx):
nb,s=0,0
for p in range(minp,maxp): # p est le périmètre
nb1=nb
for AC in range(1,maxp): # AC sera limité bien avant maxp
BC=(p-AC)//2 # division euclidienne
if BC<AC:
break # AC est trop grand, passer à la valeur suivante de AC
AB=p-AC-BC
while 1: # boucle pour tous les triangles tels que AC<=BC<=AB
if AB>=AC+BC: # le triangle n'existe pas
break # donc sortie de la boucle while...
#print("périmètre =",p,AC,BC,AB)
nb+=1
s=p*(p-2*AB)*(p-2*AC)*(p-2*BC)
Trg.append((p,AC,BC,AB,s)) # Stockage du quintuplet trouvé
BC-=1 #triangle suivant de même périmètre
AB+=1
if BC<AC:
break
Dico.update({p:[nb1,nb]}) # je complète mon dictionnaire
return Trg,Dico
def Points_Intérieurs_triangles(Max,Trg):
print(" +++ Points intérieurs à distances entières des sommets +++\n\n")
nombre=0
for p,AC,BC,AB,s in Trg:
AC2,BC2,AB2 = AC**2,BC**2,AB**2
b=AB-1
for AM in range(1, b):
AM2 = AM**2
for BM in range(AB - AM + 1,Max):
BM2 = BM**2
xc = (AC2 + AB2 - BC2)/(2 * AB)
yc = sqrt(AC2 - xc**2)
xm = (AM2 + AB2 - BM2)/(2 * AB)
ym = sqrt(AM2 - xm**2)
if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
#M est intérieur
CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
CM=int(CMd + 0.0000001)
if abs(CM - CMd) < 0.000001:
#recalcul sur entiers
xcL = AC2 + AB2 - BC2
xmL = AM2 + AB2 - BM2
Yc2 = 4 * AB2 * AC2 - (xcL**2) #4*AB*AB*yc*yc
Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
if g**2 == Yc2 * Ym2:
nombre += 1
print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
if nombre == 1300:
return
else:
break
def Points_Intérieurs_TrianglesIsocèles(Max,Trg):
print(" +++ Points intérieurs des triangles isocèles à distances entières des sommets +++\n\n")
nombre=0
for p,AC,BC,AB,s in Trg:
AC2,BC2,AB2 = AC**2,BC**2,AB**2
b=AB-1
for AM in range(1, b):
AM2 = AM**2
for BM in range(AB - AM + 1,Max):
BM2 = BM**2
xc = (AC2 + AB2 - BC2)/(2 * AB)
yc = sqrt(AC2 - xc**2)
xm = (AM2 + AB2 - BM2)/(2 * AB)
ym = sqrt(AM2 - xm**2)
if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
#M est intérieur
CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
CM=int(CMd + 0.0000001)
if abs(CM - CMd) < 0.000001:
#recalcul sur entiers
xcL = AC2 + AB2 - BC2
xmL = AM2 + AB2 - BM2
Yc2 = 4 * AB2 * AC2 - (xcL**2) #4*AB*AB*yc*yc
Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
if g**2 == Yc2 * Ym2:
if (AM==BM or AM==CM or BM==CM) and not (AM==BM==CM):
nombre += 1
print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
if nombre == 300:
return
else:
pass
else:
break
def Points_Intérieurs_TrianglesEquilatéraux(Max,Trg):
print(" +++ Points intérieurs des triangles équilatéraux à distances entières des sommets +++\n\n")
nombre=0
for p,AC,BC,AB,s in Trg:
AC2,BC2,AB2 = AC**2,BC**2,AB**2
b=AB-1
for AM in range(1, b):
AM2 = AM**2
for BM in range(AB - AM + 1,Max):
BM2 = BM**2
xc = (AC2 + AB2 - BC2)/(2 * AB)
yc = sqrt(AC2 - xc**2)
xm = (AM2 + AB2 - BM2)/(2 * AB)
ym = sqrt(AM2 - xm**2)
if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
#M est intérieur
CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
CM=int(CMd + 0.0000001)
if abs(CM - CMd) < 0.000001:
#recalcul sur entiers
xcL = AC2 + AB2 - BC2
xmL = AM2 + AB2 - BM2
Yc2 = 4 * AB2 * AC2 - (xcL**2) #4*AB*AB*yc*yc
Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
if g**2 == Yc2 * Ym2:
if AM==BM==CM:
nombre += 1
print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
if nombre == 300:
return
else:
pass
else:
break
def Distances_Points_Intérieurs_trianglesDeuxPlusUn(Max,nombre,Trg):
n=ChoixLimiteSuperieure()
print("\n\n +++ Points intérieurs à distances entières (moins une) des sommets +++\n\n")
for p,AC,BC,AB,s in Trg:
AC2,BC2,AB2 = AC**2,BC**2,AB**2
b=AB-1
for AM in range(1, b):
AM2 = AM**2
for BM in range(AB - AM + 1,Max):
BM2 = BM**2
xc = (AC2+AB2-BC2)/D(2*AB)
yc = sqD(AC2 - xc**2)
xm = (AM2 + AB2 - BM2)/D(2 * AB)
ym = sqD(AM2 - xm**2)
if ym * xc - (xm * yc) + D('0.001') <D('0') and ym * (xc - AB) - (yc * (xm - AB)) - D('0.001') > D('0'):
#M est intérieur
CMd = sqD((xm - xc)**2 + (ym - yc)**2)
CM=round(CMd)
if abs(CM - CMd) < D(10**(-n)):
xcL = AC2 + AB2 - BC2
xmL = AM2 + AB2 - BM2
Yc2 = 4 * AB2 * AC2 - (xcL**2) #4*AB*AB*yc*yc
Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
if g**2 != Yc2 * Ym2:
nombre+=1
print("N°","%4i" % nombre,": ","Périmètre :","%3i" % p,"*", "%3i" % AC,"%3i" % BC,"%3i" % AB,"--- ","%3i" % AM,"%3i" % BM, CMd)
print (" Ecart à l'entier le plus proche :", CMd-CM,"\n")
flag=0
else:
break
def AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx):
if chx=="5":
print(" +++ Triangles triés par périmètres croissants et aires croissantes +++\n\n")
for p in range(minp,maxp):
a,b=Dico[p]
Ordre=[]
if b-a>1: # s'il y a plus d'un triangle de périmètre p
Peri=Trg[a:b]
for i,(p,x,y,z,s)in enumerate(Peri):
Ordre.append((i,s))
Ordre=sorted(Ordre,key=itemgetter(1)) # tri sur 2e élément d'un tuple
for i,(no,s) in enumerate(Ordre): # évite gestion compteur
Trg[a+i]=Peri[no] #remplacement par les tuples triés
if chx =="5": # Affichage de la liste triée
p1=minp
for i,(p,x,y,z,s)in enumerate(Trg):
if p!= p1:
p1=p
print("\n")
print ("Périmètre :","%3i" % p,"%3i" % x,"%3i" % y,"%3i" % z," Aire :",round(sqrt(s)/4,3))
return Trg
def Tri_PerimetresEgaux_AiresEgales_Affichage(minp,maxp,Trg,Dico):
print(" +++ Triangles triés par périmètres égaux croissants ET aires croissantes +++\n\n")
for p in range(minp,maxp):
a,b=Dico[p]
Ordre=[]
if b-a>1: # s'il y a plus d'un triangle de périmètre p
Peri=Trg[a:b]
for i,(p,x,y,z,s)in enumerate(Peri):
Ordre.append((i,s))
Ordre=sorted(Ordre,key=itemgetter(1)) # tri sur 2e élément d'un tuple
for i,(x,s) in enumerate(Ordre): # évite gestion compteur
Trg[a+i]=Peri[x] #remplacement par les tuples triés
n,cpt,h=len(Trg),0,0
for i in range(n):
j=i-1
p0,x0,y0,z0,s0=Trg[j]
p,x,y,z,s=Trg[i]
if s==s0:
h+=1
if cpt==0: # évite de répéter le 1er triangle, si plus de deux
print ("Aire :", round(sqrt(s)/4,3))
print ("Périmètre :","%3i" % p0,"; côtés :","%3i" % x0,"%3i" % y0,"%3i" % z0)
print ("Périmètre :","%3i" % p,"; côtés :","%3i" % x,"%3i" % y,"%3i" % z)
cpt+=1
else:
if cpt>0:
print()
cpt=0
if h==0:
print ("\n\n *** Pas de réponse ***\n\n")
return
def Perimètres_et_aires_croissantes(minp,maxp,Trg,Dico):
print(" +++ Triangles triés par aires égales (ordre croissant) +++\n\n")
n,cpt=len(Trg),0
Trg=sorted(Trg,key=itemgetter(4))
for i in range(1,n):
j=i-1
p0,x0,y0,z0,s0=Trg[j]
p,x,y,z,s=Trg[i]
if s==s0:
if cpt==0:
print ("Périmètre :","%3i" % p0,"%3i" % x0,"%3i" % y0,"%3i" % z0," Aire :",round(sqrt(s0)/4,3))
print ("Périmètre :","%3i" % p,"%3i" % x,"%3i" % y,"%3i" % z," Aire :",round(sqrt(s)/4,3))
cpt+=1
else:
if cpt>0:
print()
cpt=0
return
# Menu
stoppe=0
while not stoppe:
Trg,nb,nombre=[],0,0
Dico={}
print (" **************************")
print (" * *")
print (" * Tout sur les triangles *")
print (" * *")
print (" **************************")
print ()
print ()
print (" Voulez-vous :")
print ()
print (" 1. Triangles avec points intérieurs à distances entières")
print (" 2. Triangles isocèles avec points intérieurs à distances entières")
print (" 3. Triangles équilatéraux avec points intérieurs à distances entières")
print (" 4. Triangles avec points intérieurs à 2 distances entières et une 3e non")
print (" 5. Triangles, à périmètre égal, triés par aires croissantes")
print (" 6. Triangles de même aire ET même périmètre")
print (" 7. Triangles de mêmes aires")
print ()
print (" 8. Quitter le programme")
print ()
print (" ** Votre choix : ** ",end="")
while 1:
chx=input()
if chx=="8":
stoppe=1
break
elif chx in "1 2 3 4 5 6 7":
print ("\n")
minp,maxp=MinMax()
Trg,Dico=Generation_des_Triangles(minp,maxp,Trg,Dico,chx)
if chx =="1":
print()
Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
Points_Intérieurs_triangles(maxp,Trg)
break
elif chx=="2":
print()
Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
Points_Intérieurs_TrianglesIsocèles(maxp,Trg)
break
elif chx=="3":
print()
Trg,Dico=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
Points_Intérieurs_TrianglesEquilatéraux(maxp,Trg)
break
elif chx =="4":
print()
Trg,Dico=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
Distances_Points_Intérieurs_trianglesDeuxPlusUn(maxp,nombre,Trg)
break
elif chx=="5":
AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
break
elif chx=="6":
Tri_PerimetresEgaux_AiresEgales_Affichage(minp,maxp,Trg,Dico)
break
else:
Perimètres_et_aires_croissantes(minp,maxp,Trg,Dico)
break
else:
print ("Réponses attendues : 1,2,3,4,5,6,7 ou 8. Veuillez recommencer s'il vous plaît...")
print ("\n")
print ("\n")
break
print ("\n")
print ("\n")
print (" A la prochaine !")
S'il reste des pbs, je verrai demain...
@+
En ligne
#130 20-07-2014 23:01:45
#131 21-07-2014 08:05:36
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Salut,
Des choses m'échappent : hier ça marchait avant de poster.
Ce matin je fais un essai... Boum ! Je ne devrais pas travailler le soir, je fais trop d'erreurs
Le bébé devient complexe à gérer.
Bon, j'ai corrigé et j'ai trouvé une erreur méprise de programmation qui me donne une idée :
en fait je ne testais pas les triangles isocèles ou équilatéraux mais si, parmi ces distances entières, deux étaient égales ou les 3...
C'est rectifié et j'ai même trouvé où me brancher correctement pour avoir de la vitesse : à la source, dès la lecture d'un triangle (après le 1er for. Ptêt même que je pourrais éviter de générer des triangles inutiles On verra ça plus tard).
Il y a 14 triangles isocèles pour 50<=p<=100.
N° 1 : Périmètre : 50 * 16 17 17 --- 10 9 10
N° 2 : Périmètre : 54 * 15 15 24 --- 13 13 4
N° 3 : Périmètre : 64 * 20 20 24 --- 13 13 11
N° 4 : Périmètre : 64 * 20 20 24 --- 15 15 7
N° 5 : Périmètre : 80 * 25 25 30 --- 17 17 12
N° 6 : Périmètre : 91 * 13 39 39 --- 8 33 9
N° 7 : Périmètre : 91 * 13 39 39 --- 9 33 8
N° 8 : Périmètre : 98 * 24 37 37 --- 13 30 13
N° 9 : Périmètre : 98 * 24 37 37 --- 15 26 15
N° 10 : Périmètre : 98 * 24 37 37 --- 20 19 20
N° 11 : Périmètre : 98 * 29 29 40 --- 25 25 6
N° 12 : Périmètre : 100 * 26 26 48 --- 25 25 3
N° 13 : Périmètre : 100 * 18 41 41 --- 15 28 15
N° 14 : Périmètre : 100 * 32 34 34 --- 20 18 20
Bon, il y a deux fois le même, mais - c'est marrant - aussi un "vilain petit canard"...
Au passage j'ai vérifié le triangle équilatéral de côté 273 : les longueurs sont bonnes, mais il me donne la réponse en 6 exemplaires...
Je vais réfléchir à comment virer ces "doublons".
Je vais donc maintenant devoir revérifier si les tris fonctionnent toujours ce matin avec l'ajout de reverse=True...
Je posterai dans la matinée.
@+
En ligne
#132 21-07-2014 10:44:28
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Ave Cesar,
Hier soir, à l'essai, j'avais constaté et corrigé une faute de frappe : périmère au lieu de périmètre et bin, je l'ai retrouvée ce matin.
Mais qu'est-ce que j'ai fait hier soir ????
Voilà c'est fait...
J'ai encore ajouté une option :
La fameuse "méprise".
Et je constate - sans trop de surprise que mes options 2 et 3 ne donnent pas les mêmes résultats, même si quelque chose me chiffonne sans pouvoir mettre le doigt dessus...
# -*- coding: UTF-8 -*-
from math import sqrt
from operator import itemgetter
from decimal import *
D=Decimal
getcontext().prec=25
def sqD(x):
# Calcul de la racine carrée de x
# D'après [url]http://python.jpvweb.com/mesrecettespython/doku.php?id=math_decimal[/url]
if type(x)!=type(Decimal):
x = D(str(x))
return x.sqrt()
def MinMax():
print (" +++ Choix des périmètres mini et maxi +++\n")
while 1:
mini=input("Perimètre minimim souhaité ? ")
try:
minp=int(mini)
break
except ValueError:
print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")
while 1:
maxi=input("Perimètre maximum souhaité ? ")
try:
maxp=int(maxi)+1
if maxp<=minp:
print ("Erreur,le maximum doit être supérieur au mini. Veuillez recommencer S.V.P..\n\n")
else:
break
except ValueError:
print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")
print("\n\n")
return minp,maxp
def ChoixLimiteSuperieure():
print ("\n +++ Choix de la limite supérieure +++\n")
while 1:
nn=input("Limite supérieure souhaitée entre 1 et 15 ? ")
try:
n=int(nn)
if n>0 and n<16:
break
else:
print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")
except ValueError:
print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")
return n
def Generation_des_Triangles(minp,maxp,Trg,Dico,chx):
nb,s=0,0
for p in range(minp,maxp): # p est le périmètre
nb1=nb
for AC in range(1,maxp): # AC sera limité bien avant maxp
BC=(p-AC)//2 # division euclidienne
if BC<AC:
break # AC est trop grand, passer à la valeur suivante de AC
AB=p-AC-BC
while 1: # boucle pour tous les triangles tels que AC<=BC<=AB
if AB>=AC+BC: # le triangle n'existe pas
break # donc sortie de la boucle while...
#print("périmètre =",p,AC,BC,AB)
nb+=1
s=p*(p-2*AB)*(p-2*AC)*(p-2*BC)
Trg.append((p,AC,BC,AB,s)) # Stockage du quintuplet trouvé
BC-=1 #triangle suivant de même périmètre
AB+=1
if BC<AC:
break
Dico.update({p:[nb1,nb]}) # je complète mon dictionnaire
return Trg,Dico
def Points_Intérieurs_triangles(Max,Trg):
print(" +++ Points intérieurs à distances entières des sommets +++\n\n")
nombre=0
for p,AC,BC,AB,s in Trg:
AC2,BC2,AB2 = AC**2,BC**2,AB**2
b=AB-1
for AM in range(1, b):
AM2 = AM**2
for BM in range(AB - AM + 1,Max):
BM2 = BM**2
xc = (AC2 + AB2 - BC2)/(2 * AB)
yc = sqrt(AC2 - xc**2)
xm = (AM2 + AB2 - BM2)/(2 * AB)
ym = sqrt(AM2 - xm**2)
if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
#M est intérieur
CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
CM=int(CMd + 0.0000001)
if abs(CM - CMd) < 0.000001:
#recalcul sur entiers
xcL = AC2 + AB2 - BC2
xmL = AM2 + AB2 - BM2
Yc2 = 4 * AB2 * AC2 - (xcL**2) #4*AB*AB*yc*yc
Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
if g**2 == Yc2 * Ym2:
nombre += 1
print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
if nombre == 1300:
return
else:
break
def Points_Intérieurs_2DistancesEgales(Max,Trg):
print(" +++ Points à distances entières des sommets dont DEUX égales +++\n\n")
nombre=0
for p,AC,BC,AB,s in Trg:
AC2,BC2,AB2 = AC**2,BC**2,AB**2
b=AB-1
for AM in range(1, b):
AM2 = AM**2
for BM in range(AB - AM + 1,Max):
BM2 = BM**2
xc = (AC2 + AB2 - BC2)/(2 * AB)
yc = sqrt(AC2 - xc**2)
xm = (AM2 + AB2 - BM2)/(2 * AB)
ym = sqrt(AM2 - xm**2)
if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
#M est intérieur
CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
CM=int(CMd + 0.0000001)
if abs(CM - CMd) < 0.000001:
#recalcul sur entiers
xcL = AC2 + AB2 - BC2
xmL = AM2 + AB2 - BM2
Yc2 = 4 * AB2 * AC2 - (xcL**2) #4*AB*AB*yc*yc
Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
if g**2 == Yc2 * Ym2:
if (AM==BM or AM==CM or BM==CM):
nombre += 1
print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
if nombre == 300:
return
else:
break
def Points_Intérieurs_TrianglesIsocèles(Max,Trg):
print(" +++ Points des triangles isocèles à distances entières des sommets +++\n\n")
nombre=0
for p,AC,BC,AB,s in Trg:
if (AB==AC or AB==BC or AC==BC) and not (AB==BC==AC):
AC2,BC2,AB2 = AC**2,BC**2,AB**2
b=AB-1
for AM in range(1, b):
AM2 = AM**2
for BM in range(AB - AM + 1,Max):
BM2 = BM**2
xc = (AC2 + AB2 - BC2)/(2 * AB)
yc = sqrt(AC2 - xc**2)
xm = (AM2 + AB2 - BM2)/(2 * AB)
ym = sqrt(AM2 - xm**2)
if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
#M est intérieur
CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
CM=int(CMd + 0.0000001)
if abs(CM - CMd) < 0.000001:
#recalcul sur entiers
xcL = AC2 + AB2 - BC2
xmL = AM2 + AB2 - BM2
Yc2 = 4 * AB2 * AC2 - (xcL**2) #4*AB*AB*yc*yc
Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
if g**2 == Yc2 * Ym2:
nombre += 1
print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
if nombre == 300:
return
else:
break
def Points_Intérieurs_TrianglesEquilatéraux(Max,Trg):
print(" +++ Points des triangles équilatéraux à distances entières des sommets +++\n\n")
nombre=0
for p,AC,BC,AB,s in Trg:
if AB==AC==BC:
AC2,BC2,AB2 = AC**2,BC**2,AB**2
b=AB-1
for AM in range(1, b):
AM2 = AM**2
for BM in range(AB - AM + 1,Max):
BM2 = BM**2
xc = (AC2 + AB2 - BC2)/(2 * AB)
yc = sqrt(AC2 - xc**2)
xm = (AM2 + AB2 - BM2)/(2 * AB)
ym = sqrt(AM2 - xm**2)
if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
#M est intérieur
CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
CM=int(CMd + 0.0000001)
if abs(CM - CMd) < 0.000001:
#recalcul sur entiers
xcL = AC2 + AB2 - BC2
xmL = AM2 + AB2 - BM2
Yc2 = 4 * AB2 * AC2 - (xcL**2) #4*AB*AB*yc*yc
Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
if g**2 == Yc2 * Ym2:
nombre += 1
print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
if nombre == 300:
return
else:
break
def Distances_Points_Intérieurs_trianglesDeuxPlusUn(Max,nombre,Trg):
n=ChoixLimiteSuperieure()
print("\n\n +++ Points à distances entières (moins une) des sommets +++\n\n")
for p,AC,BC,AB,s in Trg:
AC2,BC2,AB2 = AC**2,BC**2,AB**2
b=AB-1
for AM in range(1, b):
AM2 = AM**2
for BM in range(AB - AM + 1,Max):
BM2 = BM**2
xc = (AC2+AB2-BC2)/D(2*AB)
yc = sqD(AC2 - xc**2)
xm = (AM2 + AB2 - BM2)/D(2 * AB)
ym = sqD(AM2 - xm**2)
if ym * xc - (xm * yc) + D('0.001') <D('0') and ym * (xc - AB) - (yc * (xm - AB)) - D('0.001') > D('0'):
#M est intérieur
CMd = sqD((xm - xc)**2 + (ym - yc)**2)
CM=round(CMd)
if abs(CM - CMd) < D(10**(-n)):
xcL = AC2 + AB2 - BC2
xmL = AM2 + AB2 - BM2
Yc2 = 4 * AB2 * AC2 - (xcL**2) #4*AB*AB*yc*yc
Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
if g**2 != Yc2 * Ym2:
nombre+=1
print("N°","%4i" % nombre,": ","Périmètre :","%3i" % p,"*", "%3i" % AC,"%3i" % BC,"%3i" % AB,"--- ","%3i" % AM,"%3i" % BM, CMd)
print (" Ecart à l'entier le plus proche :", CMd-CM,"\n")
flag=0
else:
break
def AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx):
if chx=="6":
print(" +++ Tri à périmètre égal par aires croissantes +++\n\n")
for p in range(minp,maxp):
a,b=Dico[p]
Ordre=[]
if b-a>1: # s'il y a plus d'un triangle de périmètre p
Peri=Trg[a:b]
for i,(p,x,y,z,s)in enumerate(Peri):
Ordre.append((i,s))
Ordre=sorted(Ordre,key=itemgetter(1)) # tri sur 2e élément d'un tuple
for i,(no,s) in enumerate(Ordre): # évite gestion compteur
Trg[a+i]=Peri[no] #remplacement par les tuples triés
if chx =="6": # Affichage de la liste triée
p1=minp
for i,(p,x,y,z,s)in enumerate(Trg):
if p!= p1:
p1=p
print("\n")
print ("Périmètre :","%3i" % p,"%3i" % x,"%3i" % y,"%3i" % z," Aire :",round(sqrt(s)/4,3))
return Trg
def Tri_PerimetresEgaux_AiresEgales(minp,maxp,Trg,Dico):
print(" +++ Triangles triés, à périmètres égal, par aires croissantes +++\n\n")
for p in range(minp,maxp):
a,b=Dico[p]
Ordre=[]
if b-a>1: # s'il y a plus d'un triangle de périmètre p
Peri=Trg[a:b]
for i,(p,x,y,z,s)in enumerate(Peri):
Ordre.append((i,s))
Ordre=sorted(Ordre,key=itemgetter(1)) # tri sur 2e élément d'un tuple
for i,(x,s) in enumerate(Ordre): # évite gestion compteur
Trg[a+i]=Peri[x] #remplacement par les tuples triés
n,cpt,h=len(Trg),0,0
for i in range(n):
j=i-1
p0,x0,y0,z0,s0=Trg[j]
p,x,y,z,s=Trg[i]
if s==s0:
h+=1
if cpt==0: # évite de répéter le 1er triangle, si plus de deux
print ("Aire :", round(sqrt(s)/4,3))
print ("Périmètre :","%3i" % p0,"; côtés :","%3i" % x0,"%3i" % y0,"%3i" % z0)
print ("Périmètre :","%3i" % p,"; côtés :","%3i" % x,"%3i" % y,"%3i" % z)
cpt+=1
else:
if cpt>0:
print()
cpt=0
if h==0:
print ("\n\n *** Pas de réponse ***\n\n")
return
def Perimètres_et_aires_croissantes(minp,maxp,Trg,Dico):
print(" +++ Triangles triés par aires égales (ordre croissant) +++\n\n")
n,cpt=len(Trg),0
Trg=sorted(Trg,key=itemgetter(4))
for i in range(1,n):
j=i-1
p0,x0,y0,z0,s0=Trg[j]
p,x,y,z,s=Trg[i]
if s==s0:
if cpt==0:
print ("Périmètre :","%3i" % p0,"%3i" % x0,"%3i" % y0,"%3i" % z0," Aire :",round(sqrt(s0)/4,3))
print ("Périmètre :","%3i" % p,"%3i" % x,"%3i" % y,"%3i" % z," Aire :",round(sqrt(s)/4,3))
cpt+=1
else:
if cpt>0:
print()
cpt=0
return
# Menu
stoppe=0
while not stoppe:
Trg,nb,nombre=[],0,0
Dico={}
print (" **************************")
print (" * *")
print (" * Tout sur les triangles *")
print (" * *")
print (" **************************")
print ()
print ()
print (" Voulez-vous lister les triangles :")
print ()
print (" 1. avec points intérieurs à distances entières")
print (" 2. avec points intérieurs à distances entières dont 2 égales")
print (" 3. isocèles avec points intérieurs à distances entières")
print (" 4. équilatéraux avec points intérieurs à distances entières")
print (" 5. avec points intérieurs à 2 distances entières et une 3e non")
print (" 6. à périmètre égal, triés par aires croissantes")
print (" 7. de même aire ET même périmètre")
print (" 8. de mêmes aires")
print ()
print (" 0. Quitter le programme")
print ()
print (" ** Votre choix : ** ",end="")
while 1:
chx=input()
if chx=="0":
stoppe=1
break
elif chx in "1 2 3 4 5 6 7 8":
print ("\n")
minp,maxp=MinMax()
Trg,Dico=Generation_des_Triangles(minp,maxp,Trg,Dico,chx)
if chx =="1":
print()
Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
Points_Intérieurs_triangles(maxp,Trg)
break
elif chx=="2":
print()
Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
Points_Intérieurs_2DistancesEgales(maxp,Trg)
break
elif chx=="3":
print()
Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
Points_Intérieurs_TrianglesIsocèles(maxp,Trg)
break
elif chx=="4":
print()
Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
Points_Intérieurs_TrianglesEquilatéraux(maxp,Trg)
break
elif chx=="5":
print()
Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
Distances_Points_Intérieurs_trianglesDeuxPlusUn(maxp,nombre,Trg)
break
elif chx=="6":
AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
break
elif chx=="7":
print ()
Tri_PerimetresEgaux_AiresEgales(minp,maxp,Trg,Dico)
break
else:
print()
Perimètres_et_aires_croissantes(minp,maxp,Trg,Dico)
break
else:
print ("Réponses attendues : 0,1,2,3,4,5,6,7 ou 8. Veuillez recommencer s'il vous plaît...")
print ("\n")
print ("\n")
break
print ("\n")
print ("\n")
print (" A la prochaine !")
Il ne devrait plus rester de blagues....
Au fait, si les deux dernières décimales sont fausses cela signifie que les calculs sont donc précis à 10-23 près et non pas 10-25 comme je je le pensais.
Comme jusqu'à p =180 je n'ai pas trouvé de triangle (option 5) pour une limite supérieure de 10-10, je pense qu'il y a donc encore de la marge...
@+
[EDIT]
Le moteur du forum me rajoute systématiquement les balises url et /url de part et d'autre de l'adresse mail :
je les supprime, je clique sur Valider et hop... les revoilà !
Dernière modification par yoshi (21-07-2014 13:17:16)
En ligne
#133 21-07-2014 12:43:49
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Salutation,
Je n'ai pas beaucoup de temps à moi aujourd'hui!
J'ai testé ton dernier né il roule bien!
Il me semble plus véloce qu'avant dans certaines options on dirait.
Bon, il y a deux fois le même, mais - c'est marrant - aussi un "vilain petit canard"...
Lequel?
Et je constate - sans trop de surprise que mes options 2 et 3 ne donnent pas les mêmes résultats, même si quelque chose me chiffonne sans pouvoir mettre le doigt dessus...
J'ai fait le même constat:
** Votre choix : ** 2
+++ Choix des périmètres mini et maxi +++
Perimètre minimim souhaité ? 3
Perimètre maximum souhaité ? 80
+++ Points à distances entières des sommets dont DEUX égales +++
N° 1 : Périmètre : 54 * 15 15 24 --- 13 13 4
N° 2 : Périmètre : 64 * 20 20 24 --- 13 13 11
N° 3 : Périmètre : 64 * 20 20 24 --- 15 15 7
N° 4 : Périmètre : 80 * 25 25 30 --- 17 17 12
** Votre choix : ** 3
+++ Choix des périmètres mini et maxi +++
Perimètre minimim souhaité ? 3
Perimètre maximum souhaité ? 80
+++ Points des triangles isocèles à distances entières des sommets +++
N° 1 : Périmètre : 50 * 16 17 17 --- 10 9 10
N° 2 : Périmètre : 54 * 15 15 24 --- 13 13 4
N° 3 : Périmètre : 64 * 20 20 24 --- 13 13 11
N° 4 : Périmètre : 64 * 20 20 24 --- 15 15 7
N° 5 : Périmètre : 80 * 25 25 30 --- 17 17 12
>>>> Périmètre : 50 * 16 17 17 --- 10 9 10 aurait dû aussi apparaître parmi les résultats du choix n°2
Je ne comprends pas bien...
Au fait, si les deux dernières décimales sont fausses cela signifie que les calculs sont donc précis à 10-23 près et non pas 10-25 comme je je le pensais.
Comme jusqu'à p =180 je n'ai pas trouvé de triangle (option 5) pour une limite supérieure de 10-10, je pense qu'il y a donc encore de la marge...
Oui, j'ai pour le moment vérifié les résultats jusqu'à p = 260, il n'y a toujours pas de n>10.
___________________
Tu n'as toujours pas d'explication concernant le fait qu'aucun écart négatif n'apparaît?
@+
Hors ligne
#134 21-07-2014 12:59:40
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
Ecart négatif. Non, pas trouvé... En théorie, il devrait en apparaître.
Il faudrait que je crée un autre programme (fastidieux à la main !) récupérant les données AC,BC,AB,AM,BM et recalculer indépendamment des calculs du module de totomm, la 6e valeur et la comparer systématiquement avec celle trouvée dans le module totomm
Vilain petit canard :
N° 1 : Périmètre : 50 * 16 17 17 --- 10 9 10
N° 2 : Périmètre : 54 * 15 15 24 --- 13 13 4
N° 3 : Périmètre : 64 * 20 20 24 --- 13 13 11
N° 4 : Périmètre : 64 * 20 20 24 --- 15 15 7
N° 5 : Périmètre : 80 * 25 25 30 --- 17 17 12
N° 6 : Périmètre : 91 * 13 39 39 --- 8 33 9
N° 7 : Périmètre : 91 * 13 39 39 --- 9 33 8
N° 8 : Périmètre : 98 * 24 37 37 --- 13 30 13
N° 9 : Périmètre : 98 * 24 37 37 --- 15 26 15
N° 10 : Périmètre : 98 * 24 37 37 --- 20 19 20
N° 11 : Périmètre : 98 * 29 29 40 --- 25 25 6
N° 12 : Périmètre : 100 * 26 26 48 --- 25 25 3
N° 13 : Périmètre : 100 * 18 41 41 --- 15 28 15
N° 14 : Périmètre : 100 * 32 34 34 --- 20 18 20
A part que c'est un doublon, c'est le seul dont deux distances intérieures ne sont pas égales...
Pb "chiffonnant".
Oui, c'est bien que j'avais cru voir...
Maintenant, c'est identifié formellement.
Je vais donc pouvoir y réfléchir sérieusement : a priori, cela ne devrait pas être, aucune raison logique et je n'ai vu ni méprise ni faute de programmation.
Je ne vois plus que la génération préalable des triangles et j'en serais encore plus surpris...
Voilà de quoi affûter mes neurones...
@+
En ligne
#135 21-07-2014 13:08:22
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
RE,
EUREKA !!!
ligne 136
corriger if (AM==BM or AM==BC or BM==CM): en if (AM==BM or AM==CM or BM==CM).
Je rectifie la ligne incriminée dans le code du post #132...
Voilà, je ne suis plus chiffonné !
Quant au vilain petit canard les valeurs 8 et 9 ne sont pas si loin !
@+
[EDIT]
Si tu lances Python avec l'IDLE de windows :
- Dans la fenêtre des résultats, clique sur le menu Options
- Clique sur Configure IDLE
- Ouvre l'onglet Général
et passe Initial Window Size (in characters) Width de 80 à 90
- puis ok : la prochaine fois tu seras plus confortable...
Dernière modification par yoshi (21-07-2014 13:27:27)
En ligne
#136 21-07-2014 14:36:41
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
Modification faite, et un problème réglé de plus!
(Bien vu pour le vilain petit coin coin!)
J'ai testé pour voir avec AM == BM == CM (donc avec cette fois les trois distances internes égales) et je ne tombe pour le moment que sur deux triangles:
N° 1 : Périmètre : 128 * 40 40 48 --- 25 25 25
N° 2 : Périmètre : 256 * 80 80 96 --- 50 50 50
qui sont en réalité le même, le deuxième a simplement ces dimensions AB, BC, AC, AM, BM et CM doublées...
___________
Idée: en plus des doublons évoqués on pourrait aussi supprimer les cas de figures qui ne sont en réalité que des agrandissements conservant la forme d'autres déjà apparus.
@+
Hors ligne
#137 21-07-2014 14:38:28
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
Bin, voilà qui prouve que le prog calcule juste...
Pour les triangles équilatéraux, j'ai testé p= 819, il retrouve bien les 3 longueurs obtenues dans le fil qui t'a amené ici et en 6 exemplaires :
si x, y, z sont ces distances, j'obtiens - logiquement - x, y, z ; x, z, y ; y, x, z ; y, z, x ; z, x, y et z, y, x...
Je réfléchis aux doublons, ce devrait être jouable sans trop de ralentissement, pour les multiples, ça obligerait à conserver une palanquée de solutions.. M'enfin, je n'exclus rien a priori.
Tiens, c'est marrant, ton triangle avec point intérieur équidistant est isocèle !
Autre remarque, a priori encore avec 2 distances égales entières dans les triangles, on dirait bien qu'il s'agisse toujours des distances du point intérieur aux extrémités de la base.
Si je place un point sur la médiatrice de la base d'un tr. isocèle, il sera équidistant des extrémités, là rien de nouveau, mais que si un point intérieur est à distances égales entières de 2 sommets d'un triangle isocèle, les 2 sommets constituent la base de ce triangle est autre chose...
A vérifier.
@+
En ligne
#138 21-07-2014 15:52:04
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
Remplacer l'ancienne def par celle-là :
print(" +++ Points des triangles isocèles à distances entières des sommets +++\n\n")
nombre=0
for p,AC,BC,AB,s in Trg:
if (AB==AC or AB==BC or AC==BC) and not (AB==BC==AC):
AC2,BC2,AB2 = AC**2,BC**2,AB**2
b=AB-1
L=[]
for AM in range(1, b):
AM2 = AM**2
for BM in range(AB - AM + 1,Max):
BM2 = BM**2
xc = (AC2 + AB2 - BC2)/(2 * AB)
yc = sqrt(AC2 - xc**2)
xm = (AM2 + AB2 - BM2)/(2 * AB)
ym = sqrt(AM2 - xm**2)
if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
#M est intérieur
CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
CM=int(CMd + 0.0000001)
if abs(CM - CMd) < 0.000001:
#recalcul sur entiers
xcL = AC2 + AB2 - BC2
xmL = AM2 + AB2 - BM2
Yc2 = 4 * AB2 * AC2 - (xcL**2) #4*AB*AB*yc*yc
Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
if g**2 == Yc2 * Ym2:
if [AM,BM,CM] not in L:
nombre += 1
print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
L.append([AM,BM,CM])
L.append([AM,CM,BM])
L.append([BM,AM,CM])
L.append([BM,CM,AM])
L.append([CM,AM,BM])
L.append([CM,BM,AM])
if nombre == 300:
return
else:
break
Plus de doublons dans les tr. isocèles...
Maintenant, je vais chercher pour quelles options il y avait aussi des doublons...
@+
En ligne
#139 21-07-2014 17:32:07
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Bonsoir,
Merci, je modifie...
Avec les trois distances internes égales je trouve aussi:
N° 3 : Périmètre : 324 * 78 120 126 --- 65 65 65
N° 4 : Périmètre : 336 * 104 112 120 --- 65 65 65
et
N° 5 : Périmètre : 384 * 120 120 144 --- 75 75 75 (de même forme que n°1 et n°2)
Cette configuration semble presque aussi rare que celle avec AB = BC = AC
@+
Hors ligne
#140 21-07-2014 18:08:41
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
Si un point intérieur est à distances entières des trois sommets d'un triangle isocèle et si deux de ces distances sont égales, alors il semble que les 2 sommets desquels ce point est équidistant, sont ceux appartenant à la base de ce triangle...
Voici formulée ce qui qui sera peut-être un jour connu comme la fameuse "conjecture de yoshi".
;)
Hors ligne
#141 22-07-2014 09:55:26
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Bien le bonjour,
J'ai réécrit en partie le menu, rajouté une suppression de doublons, déplacé une option dans le menu pour faire de la place pour en mettre une autre...
L'option supplémentaire est de ne traiter que, pour les points à distances entières, les triangles scalènes en excluant les isocèles.
Quid des triangles rectangles ?
# -*- coding: UTF-8 -*-
from math import sqrt
from operator import itemgetter
from decimal import *
D=Decimal
getcontext().prec=25
def sqD(x):
# Calcul de la racine carrée de x
# D'après [url]http://python.jpvweb.com/mesrecettespython/doku.php?id=math_decimal[/url]
if type(x)!=type(Decimal):
x = D(str(x))
return x.sqrt()
def MinMax():
print (" +++ Choix des périmètres mini et maxi +++\n")
while 1:
mini=input("Périmètre minimum souhaité ? ")
try:
minp=int(mini)
break
except ValueError:
print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")
while 1:
maxi=input("Perimètre maximum souhaité ? ")
try:
maxp=int(maxi)+1
if maxp<=minp:
print ("Erreur,le maximum doit être supérieur au mini. Veuillez recommencer S.V.P..\n\n")
else:
break
except ValueError:
print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")
print("\n\n")
return minp,maxp
def ChoixLimiteSuperieure():
print ("\n +++ Choix de la limite supérieure +++\n")
while 1:
nn=input("Limite supérieure souhaitée entre 1 et 15 ? ")
try:
n=int(nn)
if n>0 and n<16:
break
else:
print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")
except ValueError:
print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")
return n
def Generation_des_Triangles(minp,maxp,Trg,Dico,chx):
nb,s=0,0
for p in range(minp,maxp): # p est le périmètre
nb1=nb
for AC in range(1,maxp): # AC sera limité bien avant maxp
BC=(p-AC)//2 # division euclidienne
if BC<AC:
break # AC est trop grand, passer à la valeur suivante de AC
AB=p-AC-BC
while 1: # boucle pour tous les triangles tels que AC<=BC<=AB
if AB>=AC+BC: # le triangle n'existe pas
break # donc sortie de la boucle while...
nb+=1
s=p*(p-2*AB)*(p-2*AC)*(p-2*BC)
Trg.append((p,AC,BC,AB,s)) # Stockage du quintuplet trouvé
BC-=1 #triangle suivant de même périmètre
AB+=1
if BC<AC:
break
Dico.update({p:[nb1,nb]}) # je complète mon dictionnaire
return Trg,Dico
def Points_Intérieurs_triangles(Max,Trg):
print(" +++ Points intérieurs à distances entières des sommets +++\n\n")
nombre=0
for p,AC,BC,AB,s in Trg:
AC2,BC2,AB2 = AC**2,BC**2,AB**2
b,L=AB-1,[]
for AM in range(1, b):
AM2,db = AM**2,AB-AM+1
for BM in range(db,Max):
BM2 = BM**2
xc = (AC2 + AB2 - BC2)/(2 * AB)
yc = sqrt(AC2 - xc**2)
xm = (AM2 + AB2 - BM2)/(2 * AB)
ym = sqrt(AM2 - xm**2)
if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
#M est intérieur
CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
CM=round(CMd) #CM=int(CMd + 0.0000001)
if abs(CM - CMd) < 0.0001:
#recalcul sur entiers
xcL = AC2 + AB2 - BC2
xmL = AM2 + AB2 - BM2
Yc2 = 4 * AB2 * AC2 - (xcL**2) #4*AB*AB*yc*yc
Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
if g**2 == Yc2 * Ym2:
if [AM,BM,CM] not in L:
nombre += 1
print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
L+=[[AM,BM,CM],[AM,CM,BM],[BM,AM,CM],[BM,CM,AM],[CM,AM,BM],[CM,BM,AM]]
if nombre == 300:
return
else:
break
def Points_Intérieurs_TrianglesScalènes(Max,Trg):
print(" +++ Triangles scalènes : points intérieurs à distances entières des sommets +++\n\n")
nombre=0
for p,AC,BC,AB,s in Trg:
if not (AB==AC or AC==BC or AB==BC):
AC2,BC2,AB2 = AC**2,BC**2,AB**2
b=AB-1
for AM in range(1, b):
AM2,db = AM**2,AB-AM+1
for BM in range(db,Max):
BM2 = BM**2
xc = (AC2 + AB2 - BC2)/(2 * AB)
yc = sqrt(AC2 - xc**2)
xm = (AM2 + AB2 - BM2)/(2 * AB)
ym = sqrt(AM2 - xm**2)
if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
#M est intérieur
CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
CM=round(CMd) #CM=int(CMd + 0.0000001)
if abs(CM - CMd) < 0.0001:
#recalcul sur entiers
xcL = AC2 + AB2 - BC2
xmL = AM2 + AB2 - BM2
Yc2 = 4 * AB2 * AC2 - (xcL**2) #4*AB*AB*yc*yc
Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
if g**2 == Yc2 * Ym2:
nombre += 1
print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
if nombre == 1300:
return
else:
break
def Points_Intérieurs_TrianglesIsocèles(Max,Trg):
print(" +++ Points des triangles isocèles à distances entières des sommets +++\n\n")
nombre=0
for p,AC,BC,AB,s in Trg:
if (AB==AC or AB==BC or AC==BC) and not (AB==BC==AC):
AC2,BC2,AB2 = AC**2,BC**2,AB**2
b=AB-1
L=[]
for AM in range(1, b):
AM2,db = AM**2,AB-AM+1
for BM in range(db,Max):
BM2 = BM**2
xc = (AC2 + AB2 - BC2)/(2 * AB)
yc = sqrt(AC2 - xc**2)
xm = (AM2 + AB2 - BM2)/(2 * AB)
ym = sqrt(AM2 - xm**2)
if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
#M est intérieur
CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
CM=round(CMd) #CM=int(CMd + 0.0000001)
if abs(CM - CMd) < 0.0001:
#recalcul sur entiers
xcL = AC2 + AB2 - BC2
xmL = AM2 + AB2 - BM2
Yc2 = 4 * AB2 * AC2 - (xcL**2) #4*AB*AB*yc*yc
Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
if g**2 == Yc2 * Ym2:
if [AM,BM,CM] not in L:
nombre += 1
print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
L+=[[AM,BM,CM],[AM,CM,BM],[BM,AM,CM],[BM,CM,AM],[CM,AM,BM],[CM,BM,AM]]
if nombre == 300:
return
else:
break
def Points_Intérieurs_TrianglesEquilatéraux(Max,Trg):
print(" +++ Points des triangles équilatéraux à distances entières des sommets +++\n\n")
nombre=0
for p,AC,BC,AB,s in Trg:
if AB==AC==BC:
AC2,BC2,AB2 = AC**2,BC**2,AB**2
b=AB-1
for AM in range(1, b):
AM2 = AM**2
for BM in range(AB - AM + 1,Max):
BM2 = BM**2
xc = (AC2 + AB2 - BC2)/(2 * AB)
yc = sqrt(AC2 - xc**2)
xm = (AM2 + AB2 - BM2)/(2 * AB)
ym = sqrt(AM2 - xm**2)
if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
#M est intérieur
CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
CM=int(CMd + 0.0000001)
if abs(CM - CMd) < 0.000001:
#recalcul sur entiers
xcL = AC2 + AB2 - BC2
xmL = AM2 + AB2 - BM2
Yc2 = 4 * AB2 * AC2 - (xcL**2) #4*AB*AB*yc*yc
Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
if g**2 == Yc2 * Ym2:
nombre += 1
print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
if nombre == 300:
return
else:
break
def Points_Intérieurs_2DistancesEgales(Max,Trg):
print(" +++ Points à distances entières des sommets dont DEUX égales +++\n\n")
nombre=0
for p,AC,BC,AB,s in Trg:
AC2,BC2,AB2 = AC**2,BC**2,AB**2
b=AB-1
for AM in range(1, b):
AM2,db = AM**2,AB-AM+1
for BM in range(db,Max):
BM2 = BM**2
xc = (AC2 + AB2 - BC2)/(2 * AB)
yc = sqrt(AC2 - xc**2)
xm = (AM2 + AB2 - BM2)/(2 * AB)
ym = sqrt(AM2 - xm**2)
if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
#M est intérieur
CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
CM=round(CMd) #CM=int(CMd + 0.0000001)
if abs(CM - CMd) < 0.000001:
#recalcul sur entiers
xcL = AC2 + AB2 - BC2
xmL = AM2 + AB2 - BM2
Yc2 = 4 * AB2 * AC2 - (xcL**2) #4*AB*AB*yc*yc
Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
if g**2 == Yc2 * Ym2:
if (AM==BM or AM==CM or BM==CM):
nombre += 1
print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
else:
break
def Distances_Points_Intérieurs_trianglesDeuxPlusUn(Max,nombre,Trg):
n=ChoixLimiteSuperieure()
print("\n\n +++ Points à distances entières (moins une) des sommets +++\n\n")
for p,AC,BC,AB,s in Trg:
AC2,BC2,AB2 = AC**2,BC**2,AB**2
b=AB-1
L=[]
for AM in range(1, b):
AM2 = AM**2
for BM in range(AB - AM + 1,Max):
BM2 = BM**2
xc = (AC2+AB2-BC2)/D(2*AB)
yc = sqD(AC2 - xc**2)
xm = (AM2 + AB2 - BM2)/D(2 * AB)
ym = sqD(AM2 - xm**2)
if ym * xc - (xm * yc) + D('0.001') <D('0') and ym * (xc - AB) - (yc * (xm - AB)) - D('0.001') > D('0'):
#M est intérieur
CMd = sqD((xm - xc)**2 + (ym - yc)**2)
CM=round(CMd)
if abs(CM - CMd) < D(10**(-n)):
xcL = AC2 + AB2 - BC2
xmL = AM2 + AB2 - BM2
Yc2 = 4 * AB2 * AC2 - (xcL**2) #4*AB*AB*yc*yc
Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
if g**2 != Yc2 * Ym2:
nombre+=1
print("N°","%4i" % nombre,": ","Périmètre :","%3i" % p,"*", "%3i" % AC,"%3i" % BC,"%3i" % AB,"--- ","%3i" % AM,"%3i" % BM, CMd)
print (" Ecart à l'entier le plus proche :", CMd-CM,"\n")
else:
break
def AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx):
if chx=="7":
print(" +++ Tri à périmètre égal par aires croissantes +++\n\n")
for p in range(minp,maxp):
a,b=Dico[p]
Ordre=[]
if b-a>1: # s'il y a plus d'un triangle de périmètre p
Peri=Trg[a:b]
for i,(p,x,y,z,s)in enumerate(Peri):
Ordre.append((i,s))
Ordre=sorted(Ordre,key=itemgetter(1)) # tri sur 2e élément d'un tuple
for i,(no,s) in enumerate(Ordre): # évite gestion compteur
Trg[a+i]=Peri[no] #remplacement par les tuples triés
if chx =="7": # Affichage de la liste triée
p1=minp
for i,(p,x,y,z,s)in enumerate(Trg):
if p!= p1:
p1=p
print("\n")
print ("Périmètre :","%3i" % p,"%3i" % x,"%3i" % y,"%3i" % z," Aire :",round(sqrt(s)/4,3))
return Trg
def Tri_PerimetresEgaux_AiresEgales(minp,maxp,Trg,Dico):
print(" +++ Triangles triés, à périmètres égal, par aires croissantes +++\n\n")
for p in range(minp,maxp):
a,b=Dico[p]
Ordre=[]
if b-a>1: # s'il y a plus d'un triangle de périmètre p
Peri=Trg[a:b]
for i,(p,x,y,z,s)in enumerate(Peri):
Ordre.append((i,s))
Ordre=sorted(Ordre,key=itemgetter(1)) # tri sur 2e élément d'un tuple
for i,(x,s) in enumerate(Ordre): # évite gestion compteur
Trg[a+i]=Peri[x] #remplacement par les tuples triés
n,cpt,h=len(Trg),0,0
for i in range(n):
j=i-1
p0,x0,y0,z0,s0=Trg[j]
p,x,y,z,s=Trg[i]
if s==s0:
h+=1
if cpt==0: # évite de répéter le 1er triangle, si plus de deux
print ("Aire :", round(sqrt(s)/4,3))
print ("Périmètre :","%3i" % p0,"; côtés :","%3i" % x0,"%3i" % y0,"%3i" % z0)
print ("Périmètre :","%3i" % p,"; côtés :","%3i" % x,"%3i" % y,"%3i" % z)
cpt+=1
else:
if cpt>0:
print()
cpt=0
if h==0:
print ("\n\n *** Pas de réponse ***\n\n")
return
def Perimètres_et_aires_croissantes(minp,maxp,Trg,Dico):
print(" +++ Triangles triés par aires égales (ordre croissant) +++\n\n")
n,cpt=len(Trg),0
Trg=sorted(Trg,key=itemgetter(4))
for i in range(1,n):
j=i-1
p0,x0,y0,z0,s0=Trg[j]
p,x,y,z,s=Trg[i]
if s==s0:
if cpt==0:
print ("Périmètre :","%3i" % p0,"%3i" % x0,"%3i" % y0,"%3i" % z0," Aire :",round(sqrt(s0)/4,3))
print ("Périmètre :","%3i" % p,"%3i" % x,"%3i" % y,"%3i" % z," Aire :",round(sqrt(s)/4,3))
cpt+=1
else:
if cpt>0:
print()
cpt=0
return
# Menu
stoppe=0
while not stoppe:
Trg,nb,nombre=[],0,0
Dico={}
print (" **************************")
print (" * *")
print (" * Tout sur les triangles *")
print (" * *")
print (" **************************")
print ()
print ()
print (" Voulez-vous lister les triangles :")
print ()
print (" 1. avec points intérieurs à distances entières")
print (" 2. avec points intérieurs à distances entières (Triangles Scalènes)")
print (" 3. isocèles avec points intérieurs à distances entières")
print (" 4. équilatéraux avec points intérieurs à distances entières")
print (" 5. avec points intérieurs à distances entières dont 2 égales")
print (" 6. avec points intérieurs à 2 distances entières et une 3e non")
print (" 7. à périmètre égal, triés par aires croissantes")
print (" 8. de même aire ET même périmètre")
print (" 9. de mêmes aires")
print ()
print (" 0. Quitter le programme")
print ()
print (" ** Votre choix : ** ",end="")
while 1:
chx=input()
if chx=="0":
stoppe=1
elif chx in "1 2 3 4 5 6 7 8 9":
print ("\n")
minp,maxp=MinMax()
Trg,Dico=Generation_des_Triangles(minp,maxp,Trg,Dico,chx)
print()
if chx =="1":
Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
Points_Intérieurs_triangles(maxp,Trg)
elif chx=="2":
Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
Points_Intérieurs_TrianglesScalènes(maxp,Trg)
elif chx=="3":
Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
Points_Intérieurs_TrianglesIsocèles(maxp,Trg)
elif chx=="4":
Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
Points_Intérieurs_TrianglesEquilatéraux(maxp,Trg)
elif chx=="5":
Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
Points_Intérieurs_2DistancesEgales(maxp,Trg)
elif chx=="6":
Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
Distances_Points_Intérieurs_trianglesDeuxPlusUn(maxp,nombre,Trg)
elif chx=="7":
AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
elif chx=="8":
Tri_PerimetresEgaux_AiresEgales(minp,maxp,Trg,Dico)
else:
Perimètres_et_aires_croissantes(minp,maxp,Trg,Dico)
break
else:
print ("Réponses attendues : 0,1,2,3,4,5,6,7, 8 ou 9. Veuillez recommencer s'il vous plaît...")
print ("\n")
print ("\n")
break
print ("\n")
print ("\n")
print (" A la prochaine !")
Petite curiosité (extrait non exaustif) déjà constatée hier:
Périmètre : 78 * 23 27 28 --- 18 20 8
Périmètre : 78 * 24 26 28 --- 17 21 8Périmètre : 98 * 16 39 43 --- 13 34 7
Périmètre : 98 * 17 38 43 --- 12 35 7Périmètre : 91 * 13 39 39 --- 8 33 9
Périmètre : 91 * 14 38 39 --- 8 34 8Périmètre : 98 * 16 38 44 --- 12 34 8
Périmètre : 98 * 16 39 43 --- 13 34 7-----------------------------------------------
Périmètre : 64 * 18 20 26 --- 15 13 9
Périmètre : 64 * 20 20 24 --- 13 13 11Périmètre : 78 * 24 26 28 --- 17 21 8
Périmètre : 80 * 25 25 30 --- 17 17 12Périmètre : 88 * 26 30 32 --- 19 15 18
Périmètre : 90 * 20 31 39 --- 19 22 11
On peut faire la même remarque pour chaque paire de lignes que je t'ai sélectionnées, c'est encore plus curieux pour les 4 premières paires sélectionnées... ;-)
@+
En ligne
#142 22-07-2014 11:10:15
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Salut yoshi,
Il y a des bugs:
- Quand on choisit l'option 6 c'est la 7 qui s'ouvre
- Quand par contre on choisit l'option 7 rien ne se passe...
J'ai essayé de faire les modifications par moi-même, mais je n'arrive pas à résoudre les problèmes.
@+
Hors ligne
#143 22-07-2014 11:28:51
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Nan,
Quand on choisit 6. 2 distances intérieures et une non c'est bien la 6 qui s'ouvre :
** Votre choix : ** 6
+++ Choix des périmètres mini et maxi +++
Périmètre minimum souhaité ? 50
Perimètre maximum souhaité ? 60+++ Choix de la limite supérieure +++
Limite supérieure souhaitée entre 1 et 15 ? 6
+++ Points à distances entières (moins une) des sommets +++
N° 1 : Périmètre : 51 * 11 19 21 --- 12 13 6.000000704054773214988985
Ecart à l'entier le plus proche : 7.04054773214988985E-7N° 2 : Périmètre : 54 * 7 23 24 --- 13 12 11.00000084100341695665260
Ecart à l'entier le plus proche : 8.4100341695665260E-7N° 3 : Périmètre : 55 * 16 19 20 --- 15 12 7.000000350647113856285487
Ecart à l'entier le plus proche : 3.50647113856285487E-7N° 4 : Périmètre : 55 * 17 18 20 --- 2 19 15.00000086121537984060985
Ecart à l'entier le plus proche : 8.6121537984060985E-7N° 5 : Périmètre : 58 * 13 21 24 --- 5 22 8.000000547323810974432554
Ecart à l'entier le plus proche : 5.47323810974432554E-7N° 6 : Périmètre : 60 * 16 22 22 --- 17 8 14.00000091382957315268276
Ecart à l'entier le plus proche : 9.1382957315268276E-7
.
Pour le point 7, aller ligne 294 et remplacer 6 par 7 (oubli de rectifier ce matin):
if chx =="6": # Affichage de la liste triée
par
if chx =="7": # Affichage de la liste triée
Je rectifie dans mon post
Dans l'IDLE de Python : taper ALT + G et n°294 tu iras de suite...
@+
En ligne
#144 22-07-2014 11:33:16
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
J'ai réécrit en partie le menu, rajouté une suppression de doublons
Très bonne chose!
L'option supplémentaire est de ne traiter que, pour les points à distances entières, les triangles scalènes..
Comme l'avait fait totomm au début, c'est bien oui.
Quid des triangles rectangles ?
Bonne question! Ce n'est pas sûr qu'il y en ait... C'est à vérifier, bonne idée! ;)
On peut faire la même remarque pour chaque paire de lignes que je t'ai sélectionnées, c'est encore plus curieux pour les 4 premières paires sélectionnées... ;-)
Intéressant... J'ai aussi remarqué ce genre de 'structure', je pense qu'il y a beaucoup de choses comme cela à explorer...
L'on doit aussi probablement pouvoir en déduire des règles assez simples permettant de générer des cas. A vérifier également...
@+
Dernière modification par 0^0 (22-07-2014 11:54:03)
Hors ligne
#145 22-07-2014 11:38:58
#146 22-07-2014 12:40:13
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
J'ai testé !
Triangles rectangles : de 20 à 120 : rien !
De 120 à 180 : 3
N° 43 : Périmètre : 150 * 25 60 65 --- 12 55 17 R
N° 57 : Périmètre : 156 * 39 52 65 --- 34 33 25 R
N° 123 : Périmètre : 176 * 48 55 73 --- 26 51 26 R
Les 2 premiers sont des triplets pythagoriciens : respectivement multiples de 5,12,13 et 3,4,5.
Le 3e est original (73 premier).
Je te mets le remplaçant du 1er module :
print(" +++ Points intérieurs à distances entières des sommets +++\n\n")
nombre=0
for p,AC,BC,AB,s in Trg:
AC2,BC2,AB2 = AC**2,BC**2,AB**2
b,L=AB-1,[]
R,r=sorted([AC2,BC2,AB2]),""
if R[2]==R[1]+R[0]:
r=" R"
for AM in range(1, b):
AM2,db = AM**2,AB-AM+1
for BM in range(db,Max):
BM2 = BM**2
xc = (AC2 + AB2 - BC2)/(2 * AB)
yc = sqrt(AC2 - xc**2)
xm = (AM2 + AB2 - BM2)/(2 * AB)
ym = sqrt(AM2 - xm**2)
if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
#M est intérieur
CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
CM=round(CMd) #CM=int(CMd + 0.0000001)
if abs(CM - CMd) < 0.0001:
#recalcul sur entiers
xcL = AC2 + AB2 - BC2
xmL = AM2 + AB2 - BM2
Yc2 = 4 * AB2 * AC2 - (xcL**2) #4*AB*AB*yc*yc
Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
if g**2 == Yc2 * Ym2:
if [AM,BM,CM] not in L:
nombre += 1
print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM,r)
L+=[[AM,BM,CM],[AM,CM,BM],[BM,AM,CM],[BM,CM,AM],[CM,AM,BM],[CM,BM,AM]]
if nombre == 1300:
return
else:
break
Méthode :
* comme on dispose déjà des carrés, je les mets dans une liste que je trie par ordre croissant et j'appelle R cette liste triée
* j'initialise la variable r à "" (vide)
* je teste alors si R[2]=R[1]+R[0]
si oui, r prend la valeur " R", sinon r reste vide
* j'ajoute simplement ensuite la variable r à la ligne des infos imprimées...
Comme il n'y en a que très peu, inutile de rajouter une option pour ça, je trouve que la mention R en bout de ligne suffit...
Remarque : 3e ex, le point M est sur la médiatrice d'un côté de l'angle droit (et pas l'hypoténuse !?)
@+
[EDIT]
Périmètre : 208 * 39 80 89 --- 50 41 41 R
Périmètre : 276 * 69 92 115 --- 52 75 29 R
Périmètre : 280 * 80 84 116 --- 41 85 41 RSurprise pour p = 300 :
Périmètre : 300 * 50 120 130 --- 24 110 34 R
Périmètre : 300 * 75 100 125 --- 36 91 51 R
Périmètre : 300 * 75 100 125 --- 78 53 51 R
Dernière modification par yoshi (22-07-2014 13:47:28)
En ligne
#147 22-07-2014 13:52:52
#148 22-07-2014 14:20:14
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Ave,
Après, il n'y a qu'un triangle rectangle jusqu'à p=350
(j'ai testé par ranches de 5, sinon, c'est très long)
Périmètre : 312 * 78 104 130 --- 68 66 50 R
Ah, oui, ma "conjecture"...
Si tu la vérifiais sur des exemples supplémentaires, je ne vois pas comment on pourrait la démontrer...
Le temps ayant passé, je me hasarde à te dire :
On est loin de ta recherche "parlante" d'une formule mathématique, hein ?
Je pense que tu constates que l'informatique t'apporte sur un plateau en quelques minutes (sans erreur de calcul et sans effort - sinon de patience -) des infos sur les triangles dont tu n'avais probablement même pas rêvé avant !!
@+
En ligne
#149 22-07-2014 14:43:03
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
Quand je me proposais de vérifier que ta conjecture tient ce n'était pas dans mon esprit la démontrer ni donc prouver qu'elle tiendra toujours... En effet, je sais très bien qu'il suffit d'un cas qui ne colle pas pour l'infirmer... Je voulais juste voir si avec un peu de patience je ne pouvais pas tomber sur un tel cas...
Pour ce qui est de la formule, je ne désespère pas! En effet, je crois que l'observation de 'structures' dans les cas de figure que nous donne ici l'informatique pourrait nous mettre sur une piste.
@+
[EDIT] question supprimée: j'ai trouvé ma réponse, merci yoshi.
Dernière modification par 0^0 (22-07-2014 15:38:10)
Hors ligne
#150 22-07-2014 15:01:06
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
Quelle option ?
S'il s'agit de la def, on copie celle fournie supra, on va dans l'IDLE Python, on sélectionne cette def et on fait : "coller"
Sinon prog complet avec affichage éventuel du " R" pendant l'exécution de l'item 1 :
# -*- coding: UTF-8 -*-
from math import sqrt
from operator import itemgetter
from decimal import *
D=Decimal
getcontext().prec=25
def sqD(x):
# Calcul de la racine carrée de x
# D'après [url]http://python.jpvweb.com/mesrecettespython/doku.php?id=math_decimal[/url]
if type(x)!=type(Decimal):
x = D(str(x))
return x.sqrt()
def MinMax():
print (" +++ Choix des périmètres mini et maxi +++\n")
while 1:
mini=input("Périmètre minimum souhaité ? ")
try:
minp=int(mini)
break
except ValueError:
print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")
while 1:
maxi=input("Perimètre maximum souhaité ? ")
try:
maxp=int(maxi)+1
if maxp<=minp:
print ("Erreur,le maximum doit être supérieur au mini. Veuillez recommencer S.V.P..\n\n")
else:
break
except ValueError:
print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")
print("\n\n")
return minp,maxp
def ChoixLimiteSuperieure():
print ("\n +++ Choix de la limite supérieure +++\n")
while 1:
nn=input("Limite supérieure souhaitée entre 1 et 15 ? ")
try:
n=int(nn)
if n>0 and n<16:
break
else:
print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")
except ValueError:
print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")
return n
def Generation_des_Triangles(minp,maxp,Trg,Dico,chx):
nb,s=0,0
for p in range(minp,maxp): # p est le périmètre
nb1=nb
for AC in range(1,maxp): # AC sera limité bien avant maxp
BC=(p-AC)//2 # division euclidienne
if BC<AC:
break # AC est trop grand, passer à la valeur suivante de AC
AB=p-AC-BC
while 1: # boucle pour tous les triangles tels que AC<=BC<=AB
if AB>=AC+BC: # le triangle n'existe pas
break # donc sortie de la boucle while...
nb+=1
s=p*(p-2*AB)*(p-2*AC)*(p-2*BC)
Trg.append((p,AC,BC,AB,s)) # Stockage du quintuplet trouvé
BC-=1 #triangle suivant de même périmètre
AB+=1
if BC<AC:
break
Dico.update({p:[nb1,nb]}) # je complète mon dictionnaire
return Trg,Dico
def Points_Intérieurs_triangles(Max,Trg):
print(" +++ Points intérieurs à distances entières des sommets +++\n\n")
nombre=0
for p,AC,BC,AB,s in Trg:
AC2,BC2,AB2 = AC**2,BC**2,AB**2
b,L=AB-1,[]
R,r=sorted([AC2,BC2,AB2]),""
if R[2]==R[1]+R[0]:
r=" R"
for AM in range(1, b):
AM2,db = AM**2,AB-AM+1
for BM in range(db,Max):
BM2 = BM**2
xc = (AC2 + AB2 - BC2)/(2 * AB)
yc = sqrt(AC2 - xc**2)
xm = (AM2 + AB2 - BM2)/(2 * AB)
ym = sqrt(AM2 - xm**2)
if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
#M est intérieur
CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
CM=round(CMd) #CM=int(CMd + 0.0000001)
if abs(CM - CMd) < 0.0001:
#recalcul sur entiers
xcL = AC2 + AB2 - BC2
xmL = AM2 + AB2 - BM2
Yc2 = 4 * AB2 * AC2 - (xcL**2) #4*AB*AB*yc*yc
Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
if g**2 == Yc2 * Ym2:
if [AM,BM,CM] not in L:
nombre += 1
print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM,r)
L+=[[AM,BM,CM],[AM,CM,BM],[BM,AM,CM],[BM,CM,AM],[CM,AM,BM],[CM,BM,AM]]
if nombre == 1300:
return
else:
break
def Points_Intérieurs_TrianglesScalènes(Max,Trg):
print(" +++ Triangles scalènes : points intérieurs à distances entières des sommets +++\n\n")
nombre=0
for p,AC,BC,AB,s in Trg:
if not (AB==AC or AC==BC or AB==BC):
AC2,BC2,AB2 = AC**2,BC**2,AB**2
b=AB-1
for AM in range(1, b):
AM2,db = AM**2,AB-AM+1
for BM in range(db,Max):
BM2 = BM**2
xc = (AC2 + AB2 - BC2)/(2 * AB)
yc = sqrt(AC2 - xc**2)
xm = (AM2 + AB2 - BM2)/(2 * AB)
ym = sqrt(AM2 - xm**2)
if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
#M est intérieur
CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
CM=round(CMd) #CM=int(CMd + 0.0000001)
if abs(CM - CMd) < 0.0001:
#recalcul sur entiers
xcL = AC2 + AB2 - BC2
xmL = AM2 + AB2 - BM2
Yc2 = 4 * AB2 * AC2 - (xcL**2) #4*AB*AB*yc*yc
Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
if g**2 == Yc2 * Ym2:
nombre += 1
print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
if nombre == 1300:
return
else:
break
def Points_Intérieurs_TrianglesIsocèles(Max,Trg):
print(" +++ Points des triangles isocèles à distances entières des sommets +++\n\n")
nombre=0
for p,AC,BC,AB,s in Trg:
if (AB==AC or AB==BC or AC==BC) and not (AB==BC==AC):
AC2,BC2,AB2 = AC**2,BC**2,AB**2
b=AB-1
L=[]
for AM in range(1, b):
AM2,db = AM**2,AB-AM+1
for BM in range(db,Max):
BM2 = BM**2
xc = (AC2 + AB2 - BC2)/(2 * AB)
yc = sqrt(AC2 - xc**2)
xm = (AM2 + AB2 - BM2)/(2 * AB)
ym = sqrt(AM2 - xm**2)
if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
#M est intérieur
CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
CM=round(CMd) #CM=int(CMd + 0.0000001)
if abs(CM - CMd) < 0.0001:
#recalcul sur entiers
xcL = AC2 + AB2 - BC2
xmL = AM2 + AB2 - BM2
Yc2 = 4 * AB2 * AC2 - (xcL**2) #4*AB*AB*yc*yc
Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
if g**2 == Yc2 * Ym2:
if [AM,BM,CM] not in L:
nombre += 1
print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
L+=[[AM,BM,CM],[AM,CM,BM],[BM,AM,CM],[BM,CM,AM],[CM,AM,BM],[CM,BM,AM]]
if nombre == 300:
return
else:
break
def Points_Intérieurs_TrianglesEquilatéraux(Max,Trg):
print(" +++ Points des triangles équilatéraux à distances entières des sommets +++\n\n")
nombre=0
for p,AC,BC,AB,s in Trg:
if AB==AC==BC:
AC2,BC2,AB2 = AC**2,BC**2,AB**2
b=AB-1
for AM in range(1, b):
AM2 = AM**2
for BM in range(AB - AM + 1,Max):
BM2 = BM**2
xc = (AC2 + AB2 - BC2)/(2 * AB)
yc = sqrt(AC2 - xc**2)
xm = (AM2 + AB2 - BM2)/(2 * AB)
ym = sqrt(AM2 - xm**2)
if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
#M est intérieur
CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
CM=int(CMd + 0.0000001)
if abs(CM - CMd) < 0.000001:
#recalcul sur entiers
xcL = AC2 + AB2 - BC2
xmL = AM2 + AB2 - BM2
Yc2 = 4 * AB2 * AC2 - (xcL**2) #4*AB*AB*yc*yc
Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
if g**2 == Yc2 * Ym2:
nombre += 1
print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
if nombre == 300:
return
else:
break
def Points_Intérieurs_2DistancesEgales(Max,Trg):
print(" +++ Points à distances entières des sommets dont DEUX égales +++\n\n")
nombre=0
for p,AC,BC,AB,s in Trg:
AC2,BC2,AB2 = AC**2,BC**2,AB**2
b=AB-1
for AM in range(1, b):
AM2,db = AM**2,AB-AM+1
for BM in range(db,Max):
BM2 = BM**2
xc = (AC2 + AB2 - BC2)/(2 * AB)
yc = sqrt(AC2 - xc**2)
xm = (AM2 + AB2 - BM2)/(2 * AB)
ym = sqrt(AM2 - xm**2)
if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
#M est intérieur
CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
CM=round(CMd) #CM=int(CMd + 0.0000001)
if abs(CM - CMd) < 0.000001:
#recalcul sur entiers
xcL = AC2 + AB2 - BC2
xmL = AM2 + AB2 - BM2
Yc2 = 4 * AB2 * AC2 - (xcL**2) #4*AB*AB*yc*yc
Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
if g**2 == Yc2 * Ym2:
if (AM==BM or AM==CM or BM==CM):
nombre += 1
print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
else:
break
def Distances_Points_Intérieurs_trianglesDeuxPlusUn(Max,nombre,Trg):
n=ChoixLimiteSuperieure()
print("\n\n +++ Points à distances entières (moins une) des sommets +++\n\n")
for p,AC,BC,AB,s in Trg:
AC2,BC2,AB2 = AC**2,BC**2,AB**2
b=AB-1
L=[]
for AM in range(1, b):
AM2 = AM**2
for BM in range(AB - AM + 1,Max):
BM2 = BM**2
xc = (AC2+AB2-BC2)/D(2*AB)
yc = sqD(AC2 - xc**2)
xm = (AM2 + AB2 - BM2)/D(2 * AB)
ym = sqD(AM2 - xm**2)
if ym * xc - (xm * yc) + D('0.001') <D('0') and ym * (xc - AB) - (yc * (xm - AB)) - D('0.001') > D('0'):
#M est intérieur
CMd = sqD((xm - xc)**2 + (ym - yc)**2)
CM=round(CMd)
if abs(CM - CMd) < D(10**(-n)):
xcL = AC2 + AB2 - BC2
xmL = AM2 + AB2 - BM2
Yc2 = 4 * AB2 * AC2 - (xcL**2) #4*AB*AB*yc*yc
Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
if g**2 != Yc2 * Ym2:
nombre+=1
print("N°","%4i" % nombre,": ","Périmètre :","%3i" % p,"*", "%3i" % AC,"%3i" % BC,"%3i" % AB,"--- ","%3i" % AM,"%3i" % BM, CMd)
print (" Ecart à l'entier le plus proche :", CMd-CM,"\n")
else:
break
def AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx):
if chx=="7":
print(" +++ Tri à périmètre égal par aires croissantes +++\n\n")
for p in range(minp,maxp):
a,b=Dico[p]
Ordre=[]
if b-a>1: # s'il y a plus d'un triangle de périmètre p
Peri=Trg[a:b]
for i,(p,x,y,z,s)in enumerate(Peri):
Ordre.append((i,s))
Ordre=sorted(Ordre,key=itemgetter(1)) # tri sur 2e élément d'un tuple
for i,(no,s) in enumerate(Ordre): # évite gestion compteur
Trg[a+i]=Peri[no] #remplacement par les tuples triés
if chx =="7": # Affichage de la liste triée
p1=minp
for i,(p,x,y,z,s)in enumerate(Trg):
if p!= p1:
p1=p
print("\n")
print ("Périmètre :","%3i" % p,"%3i" % x,"%3i" % y,"%3i" % z," Aire :",round(sqrt(s)/4,3))
return Trg
def Tri_PerimetresEgaux_AiresEgales(minp,maxp,Trg,Dico):
print(" +++ Triangles triés, à périmètres égal, par aires croissantes +++\n\n")
for p in range(minp,maxp):
a,b=Dico[p]
Ordre=[]
if b-a>1: # s'il y a plus d'un triangle de périmètre p
Peri=Trg[a:b]
for i,(p,x,y,z,s)in enumerate(Peri):
Ordre.append((i,s))
Ordre=sorted(Ordre,key=itemgetter(1)) # tri sur 2e élément d'un tuple
for i,(x,s) in enumerate(Ordre): # évite gestion compteur
Trg[a+i]=Peri[x] #remplacement par les tuples triés
n,cpt,h=len(Trg),0,0
for i in range(n):
j=i-1
p0,x0,y0,z0,s0=Trg[j]
p,x,y,z,s=Trg[i]
if s==s0:
h+=1
if cpt==0: # évite de répéter le 1er triangle, si plus de deux
print ("Aire :", round(sqrt(s)/4,3))
print ("Périmètre :","%3i" % p0,"; côtés :","%3i" % x0,"%3i" % y0,"%3i" % z0)
print ("Périmètre :","%3i" % p,"; côtés :","%3i" % x,"%3i" % y,"%3i" % z)
cpt+=1
else:
if cpt>0:
print()
cpt=0
if h==0:
print ("\n\n *** Pas de réponse ***\n\n")
return
def Perimètres_et_aires_croissantes(minp,maxp,Trg,Dico):
print(" +++ Triangles triés par aires égales (ordre croissant) +++\n\n")
n,cpt=len(Trg),0
Trg=sorted(Trg,key=itemgetter(4))
for i in range(1,n):
j=i-1
p0,x0,y0,z0,s0=Trg[j]
p,x,y,z,s=Trg[i]
if s==s0:
if cpt==0:
print ("Périmètre :","%3i" % p0,"%3i" % x0,"%3i" % y0,"%3i" % z0," Aire :",round(sqrt(s0)/4,3))
print ("Périmètre :","%3i" % p,"%3i" % x,"%3i" % y,"%3i" % z," Aire :",round(sqrt(s)/4,3))
cpt+=1
else:
if cpt>0:
print()
cpt=0
return
# Menu
stoppe=0
while not stoppe:
Trg,nb,nombre=[],0,0
Dico={}
print (" **************************")
print (" * *")
print (" * Tout sur les triangles *")
print (" * *")
print (" **************************")
print ()
print ()
print (" Voulez-vous lister les triangles :")
print ()
print (" 1. avec points intérieurs à distances entières")
print (" 2. avec points intérieurs à distances entières (Triangles Scalènes)")
print (" 3. isocèles avec points intérieurs à distances entières")
print (" 4. équilatéraux avec points intérieurs à distances entières")
print (" 5. avec points intérieurs à distances entières dont 2 égales")
print (" 6. avec points intérieurs à 2 distances entières et une 3e non")
print (" 7. à périmètre égal, triés par aires croissantes")
print (" 8. de même aire ET même périmètre")
print (" 9. de mêmes aires")
print ()
print (" 0. Quitter le programme")
print ()
print (" ** Votre choix : ** ",end="")
while 1:
chx=input()
if chx=="0":
stoppe=1
elif chx in "1 2 3 4 5 6 7 8 9":
print ("\n")
minp,maxp=MinMax()
Trg,Dico=Generation_des_Triangles(minp,maxp,Trg,Dico,chx)
print()
if chx =="1":
Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
Points_Intérieurs_triangles(maxp,Trg)
elif chx=="2":
Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
Points_Intérieurs_TrianglesScalènes(maxp,Trg)
elif chx=="3":
Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
Points_Intérieurs_TrianglesIsocèles(maxp,Trg)
elif chx=="4":
Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
Points_Intérieurs_TrianglesEquilatéraux(maxp,Trg)
elif chx=="5":
Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
Points_Intérieurs_2DistancesEgales(maxp,Trg)
elif chx=="6":
Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
Distances_Points_Intérieurs_trianglesDeuxPlusUn(maxp,nombre,Trg)
elif chx=="7":
AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
elif chx=="8":
Tri_PerimetresEgaux_AiresEgales(minp,maxp,Trg,Dico)
else:
Perimètres_et_aires_croissantes(minp,maxp,Trg,Dico)
break
else:
print ("Réponses attendues : 0,1,2,3,4,5,6,7, 8 ou 9. Veuillez recommencer s'il vous plaît...")
print ("\n")
print ("\n")
break
print ("\n")
print ("\n")
print (" A la prochaine !")
@+
Dernière modification par yoshi (22-07-2014 22:13:52)
En ligne







