Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#151 23-07-2014 13:21:14
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Salut,
J'ai refait des modifs en essayant de rationaliser (ce n'est d'ailleurs pas fini : surtout au niveau du menu).
J'ai écrit deux nouvelles fonctions (def) :
- une pour générer les triangles équilatéraux (facile)
- une pour générer les triangles isocèles.
Jusqu'alors pour traiter ces deux cas, on générait tous les triangles possibles pour ne traiter après que les Isocèles ou équilatéraux : un gâchis de temps et de mémoire.
Il faut encore que je sois sûr de ma génération des triangles isocèles, qu'il n'en manque pas un à l'appel : je vais comparer avec l'ancienne version...
@+
[EDIT]
Bon, il en manque...
Je vais chercher pourquoi.
[EDIT2]
Non, il n'en manque pas, c'est pire !
Il y a un triangle qui n'apparaît pas avec un point intérieur cherché...
Dernière modification par yoshi (23-07-2014 14:09:14)
Hors ligne
#152 23-07-2014 18:44:30
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Bonsoir,
Bon, j'ai adapté le module de générations de triangles de totomm, ça fonctionne sans aucun pb (et plus vite qu'avant) : le mien était plus simple et plus rapide, mais l'ordre des côtés était différent.
Et à cause de cela pour p=100, le calcul des points intérieurs ne trouve aucun point pour un des triangles isocèles de p=100...
Je ne sais pas pourquoi et je voudrais refaire le module de calcul des points intérieurs de totomm.
Je t'avais demandé la source de ta formule, tu m'avais répondu avec les noms de J. H. Conway M. Guy. Après recherche, je n'ai pas trouvé cette formule sur le net...
Aurais-tu un lien précis ?
Merci.
@+
Hors ligne
#153 23-07-2014 19:38:36
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Salut,
Je viens de rentrer,
Quelle formule? Celle-ci: [tex](s^2 + b^2 - a^2)^2 + (s^2 + b^2 - c^2)^2 = (2 b s)^2[/tex] ?
Je l'ai trouvée ici: http://mathworld.wolfram.com/RationalDi … oblem.html
Les deux autres, celles que j'avais mises en couleur (les 'imbuvables') ce sont mes trouvailles...
Continues de me tenir au courant de tes avancées! ;)
@+
Hors ligne
#154 23-07-2014 20:08:13
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
Comment as-tu bidouillé cela ?
Peux-tu la refaire pour chercher CM, connaissant AC,BC,AB,AM et BM ?
Le module de totomm avec ma façon de générer les triangles isocèles ne trouvant pas de point intérieur pour l'un d'entre eux m'interpelle grave !
Quelle différence avec auparavant ? L'ordre des longueurs des côtés : moi, c'est toujours a,b,b
Si le fait de changer l'ordre totommien entraîne d'avoir un point intérieur manquant à l'appel, alors ça pose question !
#!/usr/bin/python
# -*- coding: UTF-8 -*-
from math import sqrt
from operator import itemgetter
from decimal import *
D=Decimal
getcontext().prec=25
def titre(i):
a=[" +++ Points intérieurs à distances entières des sommets +++",\
" +++ Points des triangles isocèles à distances entières des sommets +++",\
" +++ Points des triangles équilatéraux à distances entières des sommets +++",\
" +++ Tri à périmètre égal par aires croissantes +++"]
print (a[i]+"\n\n")
def AfficheAiresCroissantes(minp,Trg):
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))
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 Genere_Isoceles(minp,maxp,Trg,Dico):
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...
if AB==AC or AB==BC or AC==BC:
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 Genere_Equilateraux(minp,maxp,Trg):
for p in range(minp,maxp): # p est le périmètre
if p%3==0:
Trg.append((p,p//3,p//3,p//3,0))
return Trg
def Points_Intérieurs_triangles(Max,Trg):
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_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 AiresCroissantes_MemePerimetre(minp,maxp,Dico,Trg,chx):
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
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 Principal
stoppe=0
while not stoppe:
Trg,Dico,nb,nombre=[],{},0,0
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 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=AiresCroissantes_MemePerimetre(minp,maxp,Dico,Trg,chx)
titre(0)
Points_Intérieurs_triangles(maxp,Trg)
elif chx=="2":
Trg=AiresCroissantes_MemePerimetre(minp,maxp,Dico,Trg,chx)
Points_Intérieurs_TrianglesScalènes(maxp,Trg)
elif chx=="5":
Trg=AiresCroissantes_MemePerimetre(minp,maxp,Dico,Trg,chx)
Points_Intérieurs_2DistancesEgales(maxp,Trg)
elif chx=="6":
Trg=AiresCroissantes_MemePerimetre(minp,maxp,Dico,Trg,chx)
Distances_Points_Intérieurs_trianglesDeuxPlusUn(maxp,nombre,Trg)
elif chx=="7":
titre(3)
AiresCroissantes_MemePerimetre(minp,maxp,Dico,Trg,chx)
AfficheAiresCroissantes(minp,Trg)
elif chx=="8":
Tri_PerimetresEgaux_AiresEgales(minp,maxp,Trg,Dico)
else:
Perimètres_et_aires_croissantes(minp,maxp,Trg,Dico)
elif chx in "3 4":
print ("\n")
if chx=="3":
Trg,Dico=Genere_Isoceles(minp,maxp,Trg,Dico)
Trg=AiresCroissantes_MemePerimetre(minp,maxp,Dico,Trg,chx)
titre(1)
Points_Intérieurs_triangles(maxp,Trg)
else:
Trg=Genere_Equilateraux(minp,maxp,Trg)
titre(2)
Points_Intérieurs_triangles(maxp,Trg)
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 !")
Je veux encore intégrer les triangles scalènes de la même façon que isocèles ou équilatéraux puis créer un dictionnaire de fonctions pour le menu principal : en ayant rationnalisé les 4 premiers items (branchement sur le même module), cela devrait le faire...
@+
Hors ligne
#155 23-07-2014 21:53:14
#156 23-07-2014 22:40:10
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Bonsoir,
Comment as-tu bidouillé cela ?
Ma formule imbuvable?
Comme ceci:
Pour un triangle ABC dont on connaît AB, BC, AC, AM et AB:
Soient le point D tel que [CD] est la hauteur de ABC par C et le point E tel que [ME] est la hauteur de AMB par M:
[tex]AD = \frac{AB^2+AC^2-BC^2}{2AB}[/tex]
[tex]AE = \frac{AB^2+AM^2-BM^2}{2AB}[/tex]
[tex]CD = \sqrt{AC^2-AD^2} = \sqrt{AC^2-\left(\frac{AB^2+AC^2-BC^2}{2AB}\right)^2}[/tex] Th. de Pythagore
[tex]ME = \sqrt{AM^2-AE^2} = \sqrt{AM^2-\left(\frac{AB^2+AM^2-BM^2}{2AB}\right)^2}[/tex] Th. de Pythagore
[tex]DE = AD-AE = \frac{(AC^2+BM^2)-(BC^2+AM^2)}{2AB}[/tex]
Si l'on applique encore une fois le théorème de Pythagore:
[tex]CM = \sqrt{(CD-ME)^2 + DE^2}[/tex]
Soit ma formule:
[tex]CM = \sqrt{\left(\sqrt{AC^2-\left(\frac{AB^2+AC^2-BC^2}{2AB}\right)^2}-\sqrt{AM^2-\left(\frac{AB^2+AM^2-BM^2}{2AB}\right)^2}\right)^2+\left(\frac{(AC^2+BM^2)-(BC^2+AM^2)}{2AB}\right)^2}[/tex]
Qui est trop longue pour apparaître ici en entier... Il manque la fin que voici:
[tex]CM = \sqrt{\ ................. +\left(\frac{(AC^2+BM^2)-(BC^2+AM^2)}{2AB}\right)^2}[/tex]
Sans utiliser [ tex ]:
CM = sqrt((sqrt(AC^2-((AB^2+AC^2-BC^2)/(2*AB))^2)-sqrt(AM^2-((AB^2+AM^2-BM^2)/(2*AB))^2))^2+(((AC^2+BM^2)-(BC^2+AM^2))/(2*AB))^2)
Note: on peut aussi légèrement la simplifier comme suit:
CM = sqrt((AC^2-BC^2-AM^2+BM^2)^2/(2*AB)^2+(sqrt(AC^2-(AB^2+AC^2-BC^2)^2/(2*AB)^2)-sqrt(AM^2-(AB^2+AM^2-BM^2)^2/(2*AB)^2))^2)
Peux-tu la refaire pour chercher CM, connaissant AC,BC,AB,AM et BM ?
Cette formule marche à tous les coups! :)
Rejette aussi un œil sur mon post#98... Peut-être que ça pourrait servir?
Le module de totomm avec ma façon de générer les triangles isocèles ne trouvant pas de point intérieur pour l'un d'entre eux m'interpelle grave !
Bizarre en effet!!
Quelle différence avec auparavant ? L'ordre des longueurs des côtés : moi, c'est toujours a,b,b
Si le fait de changer l'ordre totommien entraîne d'avoir un point intérieur manquant à l'appel, alors ça pose question !
Tiens moi au courant si tu y comprends quelque chose...
@+
Dernière modification par 0^0 (26-07-2014 19:04:36)
Hors ligne
#157 23-07-2014 22:51:05
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
J'ai testé ta dernière version, elle a un comportement étrange:
Lorsqu'on choisi directement l'option 3 ou 4: bug
Lorsqu'on a précédemment choisi l'option 2, l'option 3 et 4 fonctionnent avec les paramètres entrés pour l'option 2...
@+
Hors ligne
#158 24-07-2014 08:48:52
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Salut,
Résultat d'une modif directe non testée...
Le message d'erreur disait en gros :
in <module>
Trg,Dico=Genere_Isoceles(minp,maxp,Trg,Dico)
NameError: name 'minp' is not defined
minp, maxp n'étaient pas définis = inconnus du module Genere_isoceles...
Pourquoi ?
Parce qu'il manquait dans le menu, après if chx in "3 4" : , minp,maxp=MinMax().
* J'ai ajouté un module spécifique de génération des triangles scalènes
* J'ai supprimé le module de traitement des triangles scalènes
* J'ai aiguillé le traitement vers le module de totomm de base : Points_Intérieurs_triangles
* J'ai ajouté un titre à la liste des titres.
* J'ai refait le menu en conséquence.
Résultat des courses :
une fois les triangles voulus générés, ces triangles des items 1, 2, 3 et 4 sont traités par le même module.
Conséquence : il n'y aura pas de doublons dans le traitement des items 1, 2, 3 et 4 et s'il y avait des triangles rectangles et isocèles, ils sortiraient aussi avec la mention R (je ne crois pas en avoir vu).
La génération des triangles équilatéraux, est encore plus rapide qu'hier :
pour qu'un triangle soit équilatéral, il faut que son périmètre soit multiple de 3...
La boucle de création va donc progresser par pas de 3 et si :
* le mini de départ, n'est pas multiple de 3, il sera corrigé pour obtenir le multiple de 3 immédiatement supérieur 33 --> 33, 34 --> 36, 35 --> 36
* le maxi d'arrivée est multiple de 3, il est corrigé par ajout de +1 pour traiter ce multiple ; s'il ne l'est pas, il est corrigé en le multiple de 3 immédiatement supérieur +1.
Donc, supposons, tu entres
minp,maxp = 36, 61 on obtient 36,64 (si 62 ou 63, on obtient aussi 64)
minp,maxp = 35, 61 on obtient 36,64
minp,maxp = 34, 61 on obtient 36,64.
J'ai tout retesté (je l'ai déjà dit, je ne devrais pas travailler le soir...).
# -*- coding: UTF-8 -*-
from math import sqrt
from operator import itemgetter
from decimal import *
D=Decimal
getcontext().prec=25
def titre(i):
a=[" +++ Points intérieurs à distances entières des sommets +++",\
" +++ Triangles scalènes : points intérieurs à distances entières des sommets +++",\
" +++ Points des triangles isocèles à distances entières des sommets +++",\
" +++ Points des triangles équilatéraux à distances entières des sommets +++",\
" +++ Tri à périmètre égal par aires croissantes +++"]
print (a[i]+"\n\n")
def AfficheAiresCroissantes(minp,Trg):
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))
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 Genere_Isoceles(minp,maxp,Trg,Dico):
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...
if AB==AC or AB==BC or AC==BC:
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 Genere_Scalenes(minp,maxp,Trg,Dico):
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...
if not(AB==AC or AB==BC or AC==BC):
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 Genere_Equilateraux(minp,maxp,Trg):
minp+=(3-(minp%3))%3
maxp+=1+(3-(maxp%3))%3
for p in range(minp,maxp,3): # p est le périmètre
Trg.append((p,p//3,p//3,p//3,0))
return Trg
def Points_Intérieurs_triangles(Max,Trg,i):
titre(i)
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_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()
seuil ="0."+"0"*(n-1)+"1"
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(seuil):
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 AiresCroissantes_MemePerimetre(minp,maxp,Dico,Trg,chx):
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
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 Pricipal
stoppe=0
while not stoppe:
Trg,Dico,nb,nombre=[],{},0,0
print (" **************************")
print (" * *")
print (" * Tout sur les triangles *")
print (" * v. 3.0 *")
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 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=AiresCroissantes_MemePerimetre(minp,maxp,Dico,Trg,chx)
Points_Intérieurs_triangles(maxp,Trg,0)
elif chx=="5":
Trg=AiresCroissantes_MemePerimetre(minp,maxp,Dico,Trg,chx)
Points_Intérieurs_2DistancesEgales(maxp,Trg)
elif chx=="6":
Trg=AiresCroissantes_MemePerimetre(minp,maxp,Dico,Trg,chx)
Distances_Points_Intérieurs_trianglesDeuxPlusUn(maxp,nombre,Trg)
elif chx=="7":
titre(4)
AiresCroissantes_MemePerimetre(minp,maxp,Dico,Trg,chx)
AfficheAiresCroissantes(minp,Trg)
elif chx=="8":
Tri_PerimetresEgaux_AiresEgales(minp,maxp,Trg,Dico)
else:
Perimètres_et_aires_croissantes(minp,maxp,Trg,Dico)
elif chx in "2 3 4":
minp,maxp=MinMax()
print ("\n")
if chx=="2":
Trg,Dico=Genere_Scalenes(minp,maxp,Trg,Dico)
Trg=AiresCroissantes_MemePerimetre(minp,maxp,Dico,Trg,chx)
Points_Intérieurs_triangles(maxp,Trg,1)
elif chx=="3":
Trg,Dico=Genere_Isoceles(minp,maxp,Trg,Dico)
Trg=AiresCroissantes_MemePerimetre(minp,maxp,Dico,Trg,chx)
Points_Intérieurs_triangles(maxp,Trg,2)
else:
Trg=Genere_Equilateraux(minp,maxp,Trg)
Points_Intérieurs_triangles(maxp,Trg,3)
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 (24-07-2014 15:47:55)
Hors ligne
#159 24-07-2014 09:47:30
#160 24-07-2014 12:37:58
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
Premiers résultats avec n = 11 pour des cas de figure avec point M à distances entières des sommets moins une:
Périmètre : 287 * 90 95 102 --- 31 90 59.00000000009951392235555
Ecart à l'entier le plus proche : 9.951392235555E-11
Périmètre : 290 * 75 101 114 --- 82 51 50.00000000008940287355857
Ecart à l'entier le plus proche : 8.940287355857E-11
@+
Hors ligne
#161 24-07-2014 13:09:24
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
J'ai toujours été chiffonné sans rien dire.
Voilà, j'ai enfin mis le doigt dessus
False
>>>
Je suis d'accord, cet écart est inférieur à 10-10 pas 10-11...
J'ai eu alors l'idée de tester la représentation décimale de 10-11 :
9.99999999999999939496969281939810930172340963650867706746794283390045166015625E-12
Là, j'ai sursauté...
Par contre si je crée la variable seuil telle que :
>>> seuil ="0."+"0"*(n-1)+"1"
Sa représentation décimale
pour n = 11 est :
1E-11
Sa représentation décimale
pour n = 15 est :
1E-15
Là ça colle...
Donc, tu vas corriger dans le module Distances_Points_Intérieurs_trianglesDeuxPlusUn(Max,nombre,Trg):
tu intercales une ligne après la ligne 317 n=ChoixLimiteSuperieure()
où tu écris :
seuil ="0."+"0"*(n-1)+"1"
Après, il te faut descendre plus bas jusqu'à : if abs(CM - CMd) < D(10**(-n)):
où tu remplaces D(10**(-n)) par D(seuil)...
Et paf ton périmètre 287 disparaît...
J'aurais dû voir ça avant.
Le module decimal est très riche mais pas facile à utiliser...
Tiens au fait Python contient aussi un module fractions contenant une classe Fraction avec laquelle tu peux additionner des fractions comme à la main...
Le module contient aussi la fonction gcd : greatest common divisor...
@+
[EDIT]
Regarde :
>>> print(Fraction(3,20)+Fraction(7,15))
37/60
>>>
Dernière modification par yoshi (24-07-2014 13:23:15)
Hors ligne
#162 24-07-2014 15:52:56
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Bonjour,
La course à l'armement (i.e la chasse à l'écart le plus faible) est-elle vraiment de mise ?...
Tu as déjà détecté un écart de l'ordre de 10-10 !
En supposant que les dimensions de travail soient en mètres, tu as donc un écart de 10-10 m soit 1 Angstroëm ou encore le diamètre moyen d'un atome !!!!
Est-ce que cela a un sens autre que purement académique ? ;-)
@+
Hors ligne
#163 24-07-2014 17:18:13
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Re salut,
Je ne vois pas pourquoi Périmètre 287 disparaîtrait...
Si cet écart est bien inférieur à [tex]10^{-10}[/tex] il ne demeure pas moins qu'il est bien de [tex]9,951[...].10^{-11}[/tex]
J'ai donc bien pour le moment:
Périmètre : 287 * 90 95 102 --- 31 90 59.00000000009951392235555
Ecart à l'entier le plus proche : 9.951392235555E-11
Périmètre : 290 * 75 101 114 --- 82 51 50.00000000008940287355857
Ecart à l'entier le plus proche : 8.940287355857E-11
Périmètre : 293 * 64 109 120 --- 75 62 47.00000000009732380187231
Ecart à l'entier le plus proche : 9.732380187231E-11
Périmètre : 293 * 69 107 117 --- 74 66 41.00000000009340028506611
Ecart à l'entier le plus proche : 9.340028506611E-11
Périmètre : 293 * 80 93 120 --- 91 46 47.00000000009732380187231
Ecart à l'entier le plus proche : 9.732380187231E-11
Périmètre : 293 * 84 92 117 --- 89 51 41.00000000009340028506611
Ecart à l'entier le plus proche : 9.340028506611E-11
Périmètre : 294 * 77 107 110 --- 79 52 55.00000000007676995393512
Ecart à l'entier le plus proche : 7.676995393512E-11
Périmètre : 295 * 82 106 107 --- 87 33 73.00000000008468050809901
Ecart à l'entier le plus proche : 8.468050809901E-11
Périmètre : 298 * 68 107 123 --- 89 45 62.00000000009093617342116
Ecart à l'entier le plus proche : 9.093617342116E-11
Périmètre : 306 * 89 103 114 --- 39 100 50.00000000007469641807070
Ecart à l'entier le plus proche : 7.469641807070E-11 (?? un seul pour 301 <= P <= 310 ??)
Périmètre : 311 * 54 128 129 --- 68 75 53.00000000008748806321182
Ecart à l'entier le plus proche : 8.748806321182E-11
Périmètre : 312 * 92 97 123 --- 96 52 45.00000000006664012550403
Ecart à l'entier le plus proche : 6.664012550403E-11
Périmètre : 312 * 97 104 111 --- 64 96 33.00000000006664009225049
Ecart à l'entier le plus proche : 6.664009225049E-11
Périmètre : 313 * 57 122 134 --- 76 71 51.00000000008710502858698
Ecart à l'entier le plus proche : 8.710502858698E-11
Périmètre : 313 * 87 92 134 --- 106 41 51.00000000008710502858700
Ecart à l'entier le plus proche : 8.710502858700E-11
Périmètre : 314 * 89 93 132 --- 47 104 42.00000000008248308515412
Ecart à l'entier le plus proche : 8.248308515412E-11
Périmètre : 314 * 89 110 115 --- 64 104 25.00000000008248301252035
Ecart à l'entier le plus proche : 8.248301252035E-11
Périmètre : 314 * 96 107 111 --- 89 53 54.00000000005304044815397
Ecart à l'entier le plus proche : 5.304044815397E-11
Périmètre : 315 * 100 106 109 --- 90 55 51.00000000005220666332026
Ecart à l'entier le plus proche : 5.220666332026E-11
Périmètre : 316 * 90 105 121 --- 96 44 61.00000000005802481042810
Ecart à l'entier le plus proche : 5.802481042810E-11
Périmètre : 324 * 83 118 123 --- 27 115 56.00000000007811191840178
Ecart à l'entier le plus proche : 5.802480543167E-11
Périmètre : 317 * 54 130 133 --- 66 83 47.00000000008651425787379
Ecart à l'entier le plus proche : 8.651425787379E-11
Périmètre : 317 * 66 124 127 --- 75 71 53.00000000006463049643175
Ecart à l'entier le plus proche : 6.463049643175E-11
Périmètre : 317 * 93 97 127 --- 102 44 53.00000000006463049643175
Ecart à l'entier le plus proche : 6.463049643175E-11
Périmètre : 317 * 97 97 123 --- 65 96 32.00000000006847796831258
Ecart à l'entier le plus proche : 6.847796831258E-11
Périmètre : 317 * 97 97 123 --- 96 65 32.00000000006847796831258
Ecart à l'entier le plus proche : 6.847796831258E-11
Périmètre : 319 * 75 119 125 --- 74 89 30.00000000007395960761108
Ecart à l'entier le plus proche : 7.395960761108E-11
Périmètre : 321 * 71 113 137 --- 82 76 37.00000000007831666674021
Ecart à l'entier le plus proche : 7.831666674021E-11
Périmètre : 321 * 89 95 137 --- 100 58 37.00000000007831666674021
Ecart à l'entier le plus proche : 7.831666674021E-11
Périmètre : 321 * 82 112 127 --- 84 75 37.00000000006161326249606
Ecart à l'entier le plus proche : 6.161326249606E-11
Périmètre : 322 * 87 102 133 --- 53 107 34.00000000007665619096443
Ecart à l'entier le plus proche : 7.665619096443E-11
Périmètre : 322 * 78 117 127 --- 86 62 55.00000000005363477489926
Ecart à l'entier le plus proche : 5.363477489926E-11
Périmètre : 322 * 87 108 127 --- 59 107 28.00000000007665616825889
Ecart à l'entier le plus proche : 7.665616825889E-11
Périmètre : 322 * 99 103 120 --- 58 99 41.00000000005480803327182
Ecart à l'entier le plus proche : 5.480803327182E-11
Périmètre : 323 * 81 116 126 --- 91 53 63.00000000005169921995529
Ecart à l'entier le plus proche : 5.169921995529E-11
Périmètre : 323 * 85 118 120 --- 81 77 41.00000000005237046922550
Ecart à l'entier le plus proche : 5.237046922550E-11
Périmètre : 324 * 83 106 135 --- 39 115 44.00000000007811194153853
Ecart à l'entier le plus proche : 7.811194153853E-11
Périmètre : 324 * 83 118 123 --- 27 115 56.00000000007811191840178
Ecart à l'entier le plus proche : 7.811191840178E-11
Périmètre : 325 * 91 112 122 --- 96 45 67.00000000004885121901784
Ecart à l'entier le plus proche : 4.885121901784E-11
Périmètre : 326 * 74 117 135 --- 78 88 29.00000000007667648146580
Ecart à l'entier le plus proche : 7.667648146580E-11
Périmètre : 326 * 75 117 134 --- 78 89 28.00000000007667647763250
Ecart à l'entier le plus proche : 7.667647763250E-11
Périmètre : 327 * 75 124 128 --- 78 77 47.00000000005277121596760
Ecart à l'entier le plus proche : 5.277121596760E-11
Périmètre : 327 * 81 122 124 --- 86 59 63.00000000004638749135972
Ecart à l'entier le plus proche : 4.638749135972E-11
Périmètre : 327 * 88 115 124 --- 93 52 63.00000000004638749135971
Ecart à l'entier le plus proche : 4.638749135971E-11
Périmètre : 327 * 99 100 128 --- 102 53 47.00000000005277121596760
Ecart à l'entier le plus proche : 5.277121596760E-11
Périmètre : 329 * 48 139 142 --- 99 47 92.00000000009136220305128
Ecart à l'entier le plus proche : 9.136220305128E-11
Périmètre : 329 * 69 113 147 --- 112 41 72.00000000008448876176090
Ecart à l'entier le plus proche : 8.448876176090E-11
Périmètre : 329 * 73 128 128 --- 91 49 79.00000000005153055888746
Ecart à l'entier le plus proche : 5.153055888746E-11
Périmètre : 329 * 84 107 138 --- 89 80 27.00000000007671935466082
Ecart à l'entier le plus proche : 7.671935466082E-11
Périmètre : 329 * 91 100 138 --- 96 73 27.00000000007671935466080
Ecart à l'entier le plus proche : 7.671935466080E-11
Périmètre : 331 * 80 124 127 --- 78 87 37.00000000005324491493548
Ecart à l'entier le plus proche : 5.324491493548E-11
Périmètre : 331 * 86 116 129 --- 91 63 53.00000000004566976881119
Ecart à l'entier le plus proche : 4.566976881119E-11
Périmètre : 331 * 87 115 129 --- 92 62 53.00000000004566976881120
Ecart à l'entier le plus proche : 4.566976881120E-11
Périmètre : 332 * 48 137 147 --- 76 80 57.00000000008698918237996
Ecart à l'entier le plus proche : 8.698918237996E-11
Le sens de ceci? Je n'en sais trop rien à vrai dire...
Peut-être que j'espère un écart anormalement petit pour un périmètre accessible....
@+
Dernière modification par 0^0 (26-07-2014 19:06:42)
Hors ligne
#164 24-07-2014 18:20:26
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Salut
Si cet écart est bien inférieur à 10-10 il ne demeure pas moins qu'il est bien de 9,951[...].10-11
Certes, mais
1) 9.95 x 10-11 > 1 x 10-11
2) en fixant n =11, on cherche un écart inférieur à 10-11.
3) Et donc puisque 10-11 < 9,951[...].10-11 < 10-10, il ne peut plus apparaître comme étant inférieur à 10-11.
Il apparaissait faussement jusqu'à ma dernière modif...
J'ai testé tout à l'heure avant publication : rien n'est apparu.
Je n'ai pas attendu jusqu'au bout : je recommence. Si cet écart apparaissait, c'est qu'il y aurait encore une erreur !
0. Quitter le programme
** Votre choix : ** 6
+++ Choix des périmètres mini et maxi +++
Périmètre minimum souhaité ? 287
Perimètre maximum souhaité ? 288+++ Choix de la limite supérieure +++
Limite supérieure souhaitée entre 1 et 15 ? 11
+++ Points à distances entières (moins une) des sommets +++
**************************
* *
* Tout sur les triangles *
* v. 3.0 *
* *
**************************
Rien ne sort !
Et cette fois, j'ai pris patience.
Tous tes écarts sont supérieurs à 10-11 (alors que demandés inférieurs), donc ils ne devraient plus apparaître...
En conséquence, s'ils apparaissent, c'est que tu n'as pas dû mettre la modif en place.
Voilà le module corrigé pour remplacer l'ancien :
n=ChoixLimiteSuperieure()
seuil="0."+"0"*(n-1)+"1"
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(seuil):
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
@+
Dernière modification par yoshi (24-07-2014 18:22:30)
Hors ligne
#165 24-07-2014 18:51:13
#166 24-07-2014 20:02:37
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Salut,
Je suis en train de chercher à quelle(s) condition(s) un point intérieur à un triangle isocèle s'il est à distances égales des extrémités de la base, ces distances sont entières.
J'avais cru trouver une première condition : qu'il fallait que la base ait une longueur paire...
Mais j'ai des tas de contre-exemples...
Quand cette longueur est impaire, c'est bien plus difficile à trouver ce qui pourrait expliquer qu'il y ait plus de cas de bases paires qu'impaires...
@+
Hors ligne
#167 24-07-2014 20:38:01
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
Tous tes écarts sont supérieurs à 10-11 (alors que demandés inférieurs), donc ils ne devraient plus apparaître...
En conséquence, s'ils apparaissent, c'est que tu n'as pas dû mettre la modif en place.
Avec le module corrigé pour remplacer l'ancien ils apparaissent comme avant en choisissant la valeur de 10 en limite supérieure.
Pour ce qui est de ta conjecture, elle m'intrigue...
@+
Hors ligne
#168 24-07-2014 20:55:04
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
Comme ça, alors d'accord, c'est normal !
Tous tes écarts en [tex]k.10^{-11}[/tex] sont inférieurs à [tex]10^{-10}[/tex]
Avant ils apparaissaient en fixant n à 11...
Moi, aussi, je suis intrigué par cette conjecture...
@+
[EDIT]
Je ne suis pas là demain toute la journée...
Mais je vais te donner un peu de grain à moudre...
Dans le cas du triangle isocèle, quand notre point M est à distances entières égales des extrémités de la base, et si ce point était le Centre de gravité ? l'Orthocentre ? le centre du cercle inscrit (circonscrit --> cas des triangles équilatéraux que tu as montré, et dans ce cas c'est du 4 en 1 !)
a la longueur du côté, b celle de la base, c la distance de M à la base,
- si b est pair alors c est entier
- si b est impair alors c n'est pas entier...
Soit H le milieu de la base [MH] est médiatrice de cette base dans le cas de figure considéré ci-dessus...
J'ai étudié 2 cas : dans les 2 cas la distance MH est entière aussi. marrant, non ?
Dernière modification par yoshi (24-07-2014 21:52:40)
Hors ligne
#169 24-07-2014 23:10:22
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
Oui, bonne observation pour ce qui est de c, il semblerait que les triangles isocèles à cotés entiers, à bases paires et à points intérieurs à distances entières des sommets dont deux sont égales, celles précisément aux sommets de la base, sont décomposables en deux triangles rectangles symétriques accolés, avec un point M appartenant à leurs coté commun...
Par extension, pour de nombreux cas de figures (pas forcément isocèles d'ailleurs), les droites (AM), (BM) et (CM) coupent très souvent les segments [BC], [AC] et [AB] en longueurs entières, et par conséquent en autant de triangles symétriques côtes à côtes dont les points M sont situés sur les cotés communs.
@+
Dernière modification par 0^0 (25-07-2014 12:13:11)
Hors ligne
#170 25-07-2014 07:01:42
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
Juste avant de partir...
Pour la décomposition en 2 tr rect symétriques, c'est normal :
Tout point équidistant des extrémités d'un segment appartient à la médiatrice de ce segment...
Pour les 2 ex étudiés, le point n'est pas le centre du cercle inscrit (ni circonscrit), pas le centre de gravité... reste l'orthocentre. A priori la vérif va pas être de la tarte !
@+
Hors ligne
#171 25-07-2014 13:36:45
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Bonjour,
Que les triangles soient rectangles en effet, c'est tout à fait trivial! Cela dit, ce n'était pas là le point principal....
Je reformule:
De nombreux de cas de figure (pas forcément isocèles) à point M à distances entières des sommets A,B et C, sont en réalité des compositions de triangles accolés (je ne parle pas ici des trois triangles intérieurs dont on a l'habitude maintenant) dont tous les cotés sont également entiers (ce ne sont pas forcément des triangles rectangles), triangles qui sont ceux que découpent les droites (AM), (BM) et ou (CM), avec donc M situé sur leur coté commun et donc à distances entières de leurs sommets, autrement dit A, B et C mais également D: l'un des 2 sommets en commun.
@+
Hors ligne
#172 25-07-2014 15:07:43
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
Conjecture de yoshi:
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 le premier contre exemple infirmant cette conjecture:
Périmètre = 520: 150 150 220 --- 81 147 81 (et son double: 150 150 220 --- 147 81 81)
@+
Hors ligne
#173 25-07-2014 16:28:03
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Salut,
Bon bin voilà qui semble prouver que ton programme n'est pas à jour : j'avais dit plus de doublons !
Toi tu m'en sors un !
J'ai dit : plus de doublons, la preuve :
0. Quitter le programme
** Votre choix : ** 3
+++ Choix des périmètres mini et maxi +++Périmètre minimum souhaité ? 520
Perimètre maximum souhaité ? 521+++ Points des triangles isocèles à distances entières des sommets +++
N° 1 : Périmètre : 520 * 150 150 220 --- 81 147 81
N° 2 : Périmètre : 520 * 160 160 200 --- 40 165 125
N° 3 : Périmètre : 520 * 150 185 185 --- 46 147 116
Pourquoi suis-je sûr de moi ?
Pour cette raison :
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]] --> on ajoute à la liste le groupe de 6 listes de 3 éléments AM,BM,CM
if nombre == 1300:
return
Concrètement le quintuplet 520, 150, 150, 200, s est chargé.
La liste L est réinitialisée à vide.
1er calcul positif ---> [AM,BM,CM]= [87,141,87]...
Question : [87,141,87] est-elle dans L ? Non parce que L est vide...
Donc on affiche et on stocke 6 sous-listes dans L qui devient :
[[81, 147, 81], [81, 81, 147], [147, 81, 81], [147, 81, 81], [81, 81, 147], [81, 147, 81]]
Les 6 permutations possibles de [AM,BM,CM]...
Et quand arrive ton doublon [147, 81, 81] et qu'il teste :
[147, 81, 81] in L ?
Le trouve-t-il ou pas ?
Réponse Python :
>>> [147, 81, 81] in L
True
>>>
Donc il ne continue pas et ne l'affiche pas...
Plus de temps, je dois repartir...
@+
Hors ligne
#174 25-07-2014 19:16:17
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
C'est normal pour les doublons, j'avais fait pour l'occasion une modification dans le module:
def Points_Intérieurs_2DistancesEgales(Max,Trg):
en remplaçant
if (AM==BM or AM==CM or BM==CM):
par
if (AM==BM and AB==AC) or (AM==BM and AB==BC) or (AM==CM and AC==AB) or (AM==CM and AC==BC)
or (BM==CM and BC==AB) or (BM==CM and BC==AC) and (AM==BM or AM==CM or BM==CM):
@+
Hors ligne
#175 26-07-2014 12:59:06
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Salut,
Tu commences à bidouiller ? C'est comme ça qu'on apprend et avec l'expérience tu engrangeras ds "trucs et astuces" qui resserviront...
Bon, Ma conjecture démolie. Ma foi, tant pis...
Concernant les fois où elle est vérifiée, déception : le point M n'est ni
* Centre du cercle circonscrit : il faudrait pour ça que AM=BM=CM,
* Centre de gravité : il faudrait alors que, H étant le milieu de la base et S (nom générique) du sommet principal du triangle isocèle, MH=SH/3..
* Centre du cercle inscrit (démo plus bas)
* Orthocentre (démo plus bas)
Centre du cercle inscrit.
Je me suis posé 2 questions :
- vérifier le partage en 2 angles égaux : non sens à partir d'angles aux valeurs approchées
- vérifier l'équidistance des côtés de l'angle. J'ai failli le faire et je me suis souvenu d'une 3e solution (item suivant)
- rapport des longueurs
A partir d'un triangle BAC quelconque, je trace la bissectrice [AM), la parallèle à cette bissectrice passant par C.
Elle coupe (AB) en D.

[tex]\widehat{BAM} = \widehat{BDC}[/tex] comme angles correspondants
[tex]\widehat{MAC} = \widehat{ACD}[/tex] comme angles alterne-internes
[tex]\widehat{BAM} = \widehat{MAC}[/tex] puisque [AM) est bissectrice
De ces 3 égalités, on conclut que [tex]\widehat{ACD} = \widehat{ADC}[/tex] et que le triangle ACD est isocèle en C.
D'où AD = AC.
Maintenant, grâce aux parallèles, à, partir du théorème de Thalès, je peux écrire que[tex]\frac{BM}{MC} =\frac{BA}{AD}[/tex]
Et donc puisque AD=AC :
[tex]\frac{BM}{MC} =\frac{BA}{AC}[/tex]
Voilà donc la démo (que je donnais en exo à mes 3e)...
Il n'y a plus qu'à vérifier sur un exemple (encore un prog à faire pour récupérer tous les cas vrais et les tester), le triangle tel que :
AC = BC = 25 et AB=30 ; BM = AM =17 et CM=12
Le th de Pythagore me donne
CH² = 25²-15² = 20² (sans calculer puis que 25 = 5 x 5 et 15 = 3 x5 donc on a CH = 4 x 5...)
J'ai donc MH = 20 -12 = 8 et [tex] \frac{8}{12}\neq\frac{15}{25}[/tex]...[AM) n'est pas bissectrice
En même temps, je peux contrôler CM = 8 indépendamment
(Pythagore) CM² = 17²-15² = 8², ce qui prouve au passage que les calculs du module totomm sont justes.
Encore au passage, pour le centre de gravité : [tex]\frac{MH}{CH}=\frac{8}{20}=\frac5 5 \neq 1 3[/tex]
Orthocentre : il faut que (BK) soit perpendiculaire (je construis K pour que MK soit perpendiculaire et K' tel que (BK') \perp (AC)) et que B,M,K soient alignés...
Pour que B,M,K soient alignés il faut que K=K' donc que CK=CK'
Un peu de trigo.
Angle [tex]\widehat{ACM}[/tex] : [tex]\sin(\widehat{ACM})=\frac{AH}{CB}=\frac{15}{25}=\frac 3 5[/tex]
Je passe alors dans le tr CMK
[tex]MK= CM \times \sin(\widehat{ACM}) = 12\times\frac 3 5 = \frac{36}{5}[/tex]
Soit K' le point tel que [tex](BK')\perp (CA)[/tex]
[tex] CK'= 25 \times \cos(2\widehat{ACM})[/tex]
Il me faut donc le cos : [tex]\cos(\widehat{ACM})=\frac{20}{25}=\frac{4}{5}[/tex]
et [tex]\cos(2\widehat{ACM}) = 2\times \left(\frac 4 5\right)^2 -1 = \frac{7}{25}[/tex]
Et [tex]CK'= 25 \times \frac{7}{25} = 7[/tex]
[tex]CK = 12 \times \cos(\widehat{ACM})=\frac{48}{5}[/tex]
K et K' sont deux points différents.
Je ne crois pas avoir fait d'erreurs ni de calcul ni de raisonnement...
@+
Hors ligne







