Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#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

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 385

Re : Triangles ayant un point intérieur à distance entière des sommets

Attention petite erreur en ligne 357.
Je viens de corriger : écrire titre(0) et non titre[0]

Désolé

@+

Hors ligne

#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,

yoshi a écrit :

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)


yoshi a écrit :

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?

yoshi a écrit :

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!!

yoshi a écrit :

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...).

#!/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 +++",\
       "   +++ 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

0^0
Membre
Inscription : 24-06-2014
Messages : 325

Re : Triangles ayant un point intérieur à distance entière des sommets

Salut,

Magnifique!  :)

Aucun souci détecté, que du bénéf!


@+

Hors ligne

#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

>>> 9.951392235555E-11<10**(-11)
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 :

>>> from fractions import Fraction
>>> 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 :

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

@+

Dernière modification par yoshi (24-07-2014 18:22:30)

Hors ligne

#165 24-07-2014 18:51:13

0^0
Membre
Inscription : 24-06-2014
Messages : 325

Re : Triangles ayant un point intérieur à distance entière des sommets

Re,

Ok!

As-tu trouvé des cas invalidant la conjecture qui porte ton nom?

Moi encore pas...


@+

Hors ligne

#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,

yoshi a écrit :

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 :

if [AM,BM,CM] not in L:   Si la liste [AM, BM, CM] n'est pas incluse dans L la liste des liste s                              
    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 :

>>> L=[[81, 147, 81], [81, 81, 147], [147, 81, 81], [147, 81, 81], [81, 81, 147], [81, 147, 81]]
>>> [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.
  140726021443231873.jpg
  [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

Réponse rapide

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
quatre-vingt cinq plus cinquante six
Système anti-bot

Faites glisser le curseur de gauche à droite pour activer le bouton de confirmation.

Attention : Vous devez activer Javascript dans votre navigateur pour utiliser le système anti-bot.

Pied de page des forums