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

#126 20-07-2014 15:29:22

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

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

Re,

Et pour ce qui est de classer les triangles par aires décroissantes j'ai essayé ton astuce de mettre 'reverse=True', comment se fait-il que ça ne marche pas?

Quant aux écarts négatifs qui n'apparaissent pas: tu as une idée?

Observation: les deux dernières décimales de l'écart ne sont encore généralement pas exactes.


@+

Hors ligne

#127 20-07-2014 15:29:45

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

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

Re,

Pour le choix n°2, ton affichage sera perturbé si
- tes périmètres sont > 999
- tes longueurs AC,BC,AB,AM,BM sont > 999 (là pour le choix 1 aussi)

Donc, je retire un espace quelque part et j'en ajoute un à l'affichage du périmètre (c'est tout ce que je rectifie) :

print("N°","%3i" % nombre,": ","Périmètre : ","%3i" % p,"*", "%3i" % AC,"%3i" % BC,"%3i" % AB,"--- ","%3i" % AM,"%3i" % BM, CMd)

devient :

print("N°","%3i" % nombre,": ","Périmètre :","%4i" % p,"*", "%3i" % AC,"%3i" % BC,"%3i" % AB,"--- ","%3i" % AM,"%3i" % BM, CMd)

Bon tu peux toujours élargir la fenêtre à la souris au besoin ou modifier la config pour que la fenêtre soit toujours large de 90 caractères et non 80 par défaut...

@+

Hors ligne

#128 20-07-2014 19:47:04

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

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

Ave,

Ne te serais-tu pas tenté par une implémentation de 2 options supplémentaires :
* La recherche des triangles exclusivement isocèles ayant un (ou des) point(s) intérieur(s) à distances entières des sommets
* La recherche des triangles équilatéraux ayant un (ou des) point(s) intérieur(s) à distances entières des sommets

Je viens de voir ta question...
Après toutes ces modifs/simplifications, nj'ai dû supprimer ou oublier qq ch (les aires était à 0) : je cherche...
J'ai rétabli un certain nombre de choses, une m'échappe encore.
Je remettrai le code une fois corrigé...

@+

Hors ligne

#129 20-07-2014 20:57:13

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

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

Re,

#!/usr/bin/python
# -*- coding: UTF-8 -*-

from math import sqrt
from operator import itemgetter
from decimal import *
D=Decimal
getcontext().prec=25


def sqD(x):
#Calcul de la racine carrée de x
# D'après [url]http://python.jpvweb.com/mesrecettespython/doku.php?id=math_decimal[/url]
    if type(x)!=type(Decimal):
        x = D(str(x))
    return x.sqrt()

def MinMax():
    print ("            +++ Choix des périmètres mini et maxi +++\n")
    while 1:
        mini=input("Perimètre minimim souhaité ?  ")
        try:
            minp=int(mini)
            break
        except ValueError:
            print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")            
    while 1:
        maxi=input("Perimètre maximum souhaité ?  ")
        try:
            maxp=int(maxi)+1
            if maxp<=minp:
                print ("Erreur,le maximum doit être supérieur au mini. Veuillez recommencer S.V.P..\n\n")
            else:
                break
        except ValueError:
            print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")
    print("\n\n")
    return minp,maxp

def ChoixLimiteSuperieure():
    print ("\n            +++ Choix de la limite supérieure +++\n")
    while 1:
        nn=input("Limite supérieure souhaitée entre 1 et 15 ?  ")
        try:
            n=int(nn)
            if n>0 and n<16:
                break
            else:
                print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")          
        except ValueError:
            print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")
    return n

def Generation_des_Triangles(minp,maxp,Trg,Dico,chx):
    nb,s=0,0
    for p in range(minp,maxp): # p est le périmètre
        nb1=nb
        for AC in range(1,maxp): # AC sera limité bien avant maxp
            BC=(p-AC)//2 # division euclidienne
            if BC<AC:
                break # AC est trop grand, passer à la valeur suivante de AC
            AB=p-AC-BC
            while 1: # boucle pour tous les triangles tels que AC<=BC<=AB
                if AB>=AC+BC: # le triangle n'existe pas
                    break # donc sortie de la boucle while...
                #print("périmètre =",p,AC,BC,AB)
                nb+=1
                s=p*(p-2*AB)*(p-2*AC)*(p-2*BC)
                Trg.append((p,AC,BC,AB,s))  # Stockage du quintuplet trouvé
                BC-=1 #triangle suivant de même périmètre
                AB+=1
                if BC<AC:
                    break
        Dico.update({p:[nb1,nb]})  # je complète mon dictionnaire
    return Trg,Dico

def Points_Intérieurs_triangles(Max,Trg):
    print("       +++ Points intérieurs à distances entières des sommets +++\n\n")
    nombre=0
    for p,AC,BC,AB,s in Trg:
        AC2,BC2,AB2 = AC**2,BC**2,AB**2
        b=AB-1
        for AM in range(1, b):
            AM2 = AM**2
            for BM in range(AB - AM + 1,Max):
                BM2 = BM**2
                xc = (AC2 + AB2 - BC2)/(2 * AB)
                yc = sqrt(AC2 - xc**2)
                xm = (AM2 + AB2 - BM2)/(2 * AB)
                ym = sqrt(AM2 - xm**2)            
                if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
                    #M est intérieur                          
                    CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
                    CM=int(CMd + 0.0000001)
                    if abs(CM - CMd) < 0.000001:
                        #recalcul sur entiers
                        xcL = AC2 + AB2 - BC2
                        xmL = AM2 + AB2 - BM2
                        Yc2 = 4 * AB2 * AC2 - (xcL**2)  #4*AB*AB*yc*yc
                        Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
                        g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
                        if g**2 == Yc2 * Ym2:
                            nombre += 1
                            print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
                            if nombre == 1300:            
                                return
                else:
                    break

def Points_Intérieurs_TrianglesIsocèles(Max,Trg):
    print("     +++ Points intérieurs des triangles isocèles à distances entières des sommets +++\n\n")
    nombre=0
    for p,AC,BC,AB,s in Trg:
        AC2,BC2,AB2 = AC**2,BC**2,AB**2
        b=AB-1
        for AM in range(1, b):
            AM2 = AM**2
            for BM in range(AB - AM + 1,Max):
                BM2 = BM**2
                xc = (AC2 + AB2 - BC2)/(2 * AB)
                yc = sqrt(AC2 - xc**2)
                xm = (AM2 + AB2 - BM2)/(2 * AB)
                ym = sqrt(AM2 - xm**2)            
                if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
                    #M est intérieur                          
                    CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
                    CM=int(CMd + 0.0000001)
                    if abs(CM - CMd) < 0.000001:
                        #recalcul sur entiers
                        xcL = AC2 + AB2 - BC2
                        xmL = AM2 + AB2 - BM2
                        Yc2 = 4 * AB2 * AC2 - (xcL**2)  #4*AB*AB*yc*yc
                        Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
                        g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
                        if g**2 == Yc2 * Ym2:
                            if (AM==BM or AM==CM or BM==CM) and not (AM==BM==CM):
                                nombre += 1
                                print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
                                if nombre == 300:            
                                    return
                            else:
                                pass
                else:
                    break

def Points_Intérieurs_TrianglesEquilatéraux(Max,Trg):
    print("     +++ Points intérieurs des triangles équilatéraux à distances entières des sommets +++\n\n")
    nombre=0
    for p,AC,BC,AB,s in Trg:
        AC2,BC2,AB2 = AC**2,BC**2,AB**2
        b=AB-1
        for AM in range(1, b):
            AM2 = AM**2
            for BM in range(AB - AM + 1,Max):
                BM2 = BM**2
                xc = (AC2 + AB2 - BC2)/(2 * AB)
                yc = sqrt(AC2 - xc**2)
                xm = (AM2 + AB2 - BM2)/(2 * AB)
                ym = sqrt(AM2 - xm**2)            
                if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
                    #M est intérieur                          
                    CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
                    CM=int(CMd + 0.0000001)
                    if abs(CM - CMd) < 0.000001:
                        #recalcul sur entiers
                        xcL = AC2 + AB2 - BC2
                        xmL = AM2 + AB2 - BM2
                        Yc2 = 4 * AB2 * AC2 - (xcL**2)  #4*AB*AB*yc*yc
                        Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
                        g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
                        if g**2 == Yc2 * Ym2:
                            if AM==BM==CM:
                                nombre += 1
                                print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
                                if nombre == 300:                                    
                                    return
                            else:
                                pass
                else:
                    break

def Distances_Points_Intérieurs_trianglesDeuxPlusUn(Max,nombre,Trg):
    n=ChoixLimiteSuperieure()  
    print("\n\n       +++ Points intérieurs à distances entières (moins une) des sommets +++\n\n")
    for p,AC,BC,AB,s in Trg:
        AC2,BC2,AB2 = AC**2,BC**2,AB**2
        b=AB-1
        for AM in range(1, b):
            AM2 = AM**2
            for BM in range(AB - AM + 1,Max):
                BM2 = BM**2
                xc = (AC2+AB2-BC2)/D(2*AB)
                yc = sqD(AC2 - xc**2)
                xm = (AM2 + AB2 - BM2)/D(2 * AB)
                ym = sqD(AM2 - xm**2)          
                if  ym * xc - (xm * yc) + D('0.001') <D('0') and  ym * (xc - AB) - (yc * (xm - AB)) - D('0.001') > D('0'):
                    #M est intérieur                
                    CMd = sqD((xm - xc)**2 + (ym - yc)**2)
                    CM=round(CMd)
                    if abs(CM - CMd) < D(10**(-n)):
                        xcL = AC2 + AB2 - BC2
                        xmL = AM2 + AB2 - BM2
                        Yc2 = 4 * AB2 * AC2 - (xcL**2)  #4*AB*AB*yc*yc
                        Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
                        g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
                        if g**2 != Yc2 * Ym2:
                            nombre+=1
                            print("N°","%4i" % nombre,": ","Périmètre :","%3i" % p,"*", "%3i" % AC,"%3i" % BC,"%3i" % AB,"--- ","%3i" % AM,"%3i" % BM, CMd)
                            print ("       Ecart à l'entier le plus proche :", CMd-CM,"\n")
                            flag=0
                else:
                    break
   
def AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx):
    if chx=="5":
        print("       +++ Triangles triés par périmètres croissants et aires croissantes +++\n\n")
    for p in range(minp,maxp):
        a,b=Dico[p]
        Ordre=[]
        if b-a>1:  # s'il y a plus d'un triangle de périmètre p
            Peri=Trg[a:b]  
            for i,(p,x,y,z,s)in enumerate(Peri):
                Ordre.append((i,s))
            Ordre=sorted(Ordre,key=itemgetter(1)) # tri sur 2e élément d'un tuple
            for i,(no,s) in enumerate(Ordre): # évite gestion compteur
                Trg[a+i]=Peri[no]  #remplacement par les tuples triés

    if chx =="5": # Affichage de la liste triée
        p1=minp
        for i,(p,x,y,z,s)in enumerate(Trg):
            if p!= p1:
                p1=p
                print("\n")  
            print ("Périmètre :","%3i" % p,"%3i" % x,"%3i" % y,"%3i" % z,"  Aire :",round(sqrt(s)/4,3))
    return Trg

def Tri_PerimetresEgaux_AiresEgales_Affichage(minp,maxp,Trg,Dico):
    print("       +++ Triangles triés par périmètres égaux croissants ET aires croissantes +++\n\n")
    for p in range(minp,maxp):
        a,b=Dico[p]
        Ordre=[]
        if b-a>1:  # s'il y a plus d'un triangle de périmètre p
            Peri=Trg[a:b]
            for i,(p,x,y,z,s)in enumerate(Peri):
                Ordre.append((i,s))
            Ordre=sorted(Ordre,key=itemgetter(1)) # tri sur 2e élément d'un tuple
            for i,(x,s) in enumerate(Ordre): # évite gestion compteur
                Trg[a+i]=Peri[x]  #remplacement par les tuples triés  
    n,cpt,h=len(Trg),0,0
    for i in range(n):
        j=i-1
        p0,x0,y0,z0,s0=Trg[j]
        p,x,y,z,s=Trg[i]
        if s==s0:
            h+=1
            if cpt==0: # évite de répéter le 1er triangle, si plus de deux
                print ("Aire :", round(sqrt(s)/4,3))
                print ("Périmètre :","%3i" % p0,"; côtés :","%3i" % x0,"%3i" % y0,"%3i" % z0)
            print ("Périmètre :","%3i" % p,"; côtés :","%3i" % x,"%3i" % y,"%3i" % z)
            cpt+=1
        else:
            if cpt>0:
                print()
                cpt=0
    if h==0:
        print ("\n\n         *** Pas de réponse ***\n\n")
    return

def Perimètres_et_aires_croissantes(minp,maxp,Trg,Dico):
    print("       +++ Triangles triés par aires égales (ordre croissant) +++\n\n")
    n,cpt=len(Trg),0
    Trg=sorted(Trg,key=itemgetter(4))
    for i in range(1,n):
        j=i-1
        p0,x0,y0,z0,s0=Trg[j]      
        p,x,y,z,s=Trg[i]
        if s==s0:
            if cpt==0:
                print ("Périmètre :","%3i" % p0,"%3i" % x0,"%3i" % y0,"%3i" % z0,"  Aire :",round(sqrt(s0)/4,3))
            print ("Périmètre :","%3i" % p,"%3i" % x,"%3i" % y,"%3i" % z,"  Aire :",round(sqrt(s)/4,3))
            cpt+=1
        else:
            if cpt>0:
                print()
                cpt=0
    return


# Menu
stoppe=0
while not stoppe:
    Trg,nb,nombre=[],0,0
    Dico={}
    print ("                 **************************")
    print ("                 *                        *")
    print ("                 * Tout sur les triangles *")
    print ("                 *                        *")
    print ("                 **************************")
    print ()
    print ()
    print ("             Voulez-vous :")
    print ()
    print ("     1. Triangles avec points intérieurs à distances entières")
    print ("     2. Triangles isocèles avec points intérieurs à distances entières")
    print ("     3. Triangles équilatéraux avec points intérieurs à distances entières")
    print ("     4. Triangles avec points intérieurs à 2 distances entières et une 3e non")
    print ("     5. Triangles, à périmètre égal, triés par aires croissantes")
    print ("     6. Triangles de même aire ET même périmètre")
    print ("     7. Triangles de mêmes aires")
    print ()
    print ("          8. Quitter le programme")
    print ()
    print ("                    **  Votre choix : ** ",end="")
    while 1:
        chx=input()
        if chx=="8":
            stoppe=1
            break
        elif chx in "1 2 3 4 5 6 7":
            print ("\n")
            minp,maxp=MinMax()
            Trg,Dico=Generation_des_Triangles(minp,maxp,Trg,Dico,chx)
            if chx =="1":
                print()
                Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
                Points_Intérieurs_triangles(maxp,Trg)
                break
            elif chx=="2":
                print()
                Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
                Points_Intérieurs_TrianglesIsocèles(maxp,Trg)
                break
            elif chx=="3":
                print()
                Trg,Dico=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
                Points_Intérieurs_TrianglesEquilatéraux(maxp,Trg)
                break              
            elif chx =="4":
                print()
                Trg,Dico=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
                Distances_Points_Intérieurs_trianglesDeuxPlusUn(maxp,nombre,Trg)
                break              
            elif chx=="5":              
                AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
                break
            elif chx=="6":
                Tri_PerimetresEgaux_AiresEgales_Affichage(minp,maxp,Trg,Dico)
                break
            else:
                Perimètres_et_aires_croissantes(minp,maxp,Trg,Dico)
                break
        else:
            print ("Réponses attendues : 1,2,3,4,5,6,7 ou 8. Veuillez recommencer s'il vous plaît...")
            print ("\n")
            print ("\n")
            break
    print ("\n")
    print ("\n")

print ("                 A la prochaine !")

S'il reste des pbs, je verrai demain...

@+

Hors ligne

#130 20-07-2014 23:01:45

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

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

Bonsoir!

Ce programme devient vraiment très complet! Super!!

Je l'essaye de suite avant de rejoindre le pays des rêves...


@+

Hors ligne

#131 21-07-2014 08:05:36

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

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

Salut,

Des choses m'échappent : hier ça marchait avant de poster.
Ce matin je fais un essai... Boum ! Je ne devrais pas travailler le soir, je fais trop d'erreurs
Le bébé devient complexe à gérer.

Bon, j'ai corrigé et j'ai trouvé une erreur méprise  de programmation qui me donne une idée :
en fait je ne testais pas les triangles isocèles ou équilatéraux mais si, parmi ces distances entières, deux étaient égales ou les 3...

C'est rectifié et j'ai même trouvé où me brancher correctement pour avoir de la vitesse : à la source, dès la lecture d'un triangle (après le 1er for. Ptêt même que je pourrais éviter de générer des triangles inutiles  On verra ça plus tard).

Il y a 14 triangles isocèles pour 50<=p<=100.

N°    1  :  Périmètre :  50  *  16  17  17  ---   10   9  10
N°    2  :  Périmètre :  54  *  15  15  24  ---   13  13   4
N°    3  :  Périmètre :  64  *  20  20  24  ---   13  13  11
N°    4  :  Périmètre :  64  *  20  20  24  ---   15  15   7
N°    5  :  Périmètre :  80  *  25  25  30  ---   17  17  12
N°    6  :  Périmètre :  91  *  13  39  39  ---    8  33   9
N°    7  :  Périmètre :  91  *  13  39  39  ---    9  33   8
N°    8  :  Périmètre :  98  *  24  37  37  ---   13  30  13
N°    9  :  Périmètre :  98  *  24  37  37  ---   15  26  15
N°   10  :  Périmètre :  98  *  24  37  37  ---   20  19  20
N°   11  :  Périmètre :  98  *  29  29  40  ---   25  25   6
N°   12  :  Périmètre : 100  *  26  26  48  ---   25  25   3
N°   13  :  Périmètre : 100  *  18  41  41  ---   15  28  15
N°   14  :  Périmètre : 100  *  32  34  34  ---   20  18  20

Bon, il y a deux fois le même, mais - c'est marrant - aussi un "vilain petit canard"...


Au passage j'ai vérifié le triangle équilatéral de côté 273 : les longueurs sont bonnes, mais il me donne la réponse en 6 exemplaires...
Je vais réfléchir à comment virer ces "doublons".

Je vais donc maintenant devoir revérifier si les tris fonctionnent toujours ce matin avec l'ajout de reverse=True...

Je posterai dans la matinée.

@+

Hors ligne

#132 21-07-2014 10:44:28

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

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

Ave Cesar,


Hier soir, à l'essai, j'avais constaté et corrigé une faute de frappe : périmère au lieu de périmètre et bin, je l'ai retrouvée ce matin.
Mais qu'est-ce que j'ai fait hier soir ????

Voilà c'est fait...
J'ai encore ajouté une option :
La fameuse "méprise".
Et je constate - sans trop de surprise que mes options 2 et 3 ne donnent pas les mêmes résultats, même si quelque chose me chiffonne sans pouvoir mettre le doigt dessus...

#!/usr/bin/python
# -*- coding: UTF-8 -*-

from math import sqrt
from operator import itemgetter
from decimal import *
D=Decimal
getcontext().prec=25


def sqD(x):
# Calcul de la racine carrée de x
# D'après [url]http://python.jpvweb.com/mesrecettespython/doku.php?id=math_decimal[/url]
    if type(x)!=type(Decimal):
        x = D(str(x))
    return x.sqrt()

def MinMax():
    print ("            +++ Choix des périmètres mini et maxi +++\n")
    while 1:
        mini=input("Perimètre minimim souhaité ?  ")
        try:
            minp=int(mini)
            break
        except ValueError:
            print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")            
    while 1:
        maxi=input("Perimètre maximum souhaité ?  ")
        try:
            maxp=int(maxi)+1
            if maxp<=minp:
                print ("Erreur,le maximum doit être supérieur au mini. Veuillez recommencer S.V.P..\n\n")
            else:
                break
        except ValueError:
            print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")
    print("\n\n")
    return minp,maxp

def ChoixLimiteSuperieure():
    print ("\n            +++ Choix de la limite supérieure +++\n")
    while 1:
        nn=input("Limite supérieure souhaitée entre 1 et 15 ?  ")
        try:
            n=int(nn)
            if n>0 and n<16:
                break
            else:
                print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")          
        except ValueError:
            print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")
    return n

def Generation_des_Triangles(minp,maxp,Trg,Dico,chx):
    nb,s=0,0
    for p in range(minp,maxp): # p est le périmètre
        nb1=nb
        for AC in range(1,maxp): # AC sera limité bien avant maxp
            BC=(p-AC)//2 # division euclidienne
            if BC<AC:
                break # AC est trop grand, passer à la valeur suivante de AC
            AB=p-AC-BC
            while 1: # boucle pour tous les triangles tels que AC<=BC<=AB
                if AB>=AC+BC: # le triangle n'existe pas
                    break # donc sortie de la boucle while...
                #print("périmètre =",p,AC,BC,AB)
                nb+=1
                s=p*(p-2*AB)*(p-2*AC)*(p-2*BC)
                Trg.append((p,AC,BC,AB,s))  # Stockage du quintuplet trouvé
                BC-=1 #triangle suivant de même périmètre
                AB+=1
                if BC<AC:
                    break
        Dico.update({p:[nb1,nb]})  # je complète mon dictionnaire
    return Trg,Dico

def Points_Intérieurs_triangles(Max,Trg):
    print("       +++ Points intérieurs à distances entières des sommets +++\n\n")
    nombre=0
    for p,AC,BC,AB,s in Trg:
        AC2,BC2,AB2 = AC**2,BC**2,AB**2
        b=AB-1
        for AM in range(1, b):
            AM2 = AM**2
            for BM in range(AB - AM + 1,Max):
                BM2 = BM**2
                xc = (AC2 + AB2 - BC2)/(2 * AB)
                yc = sqrt(AC2 - xc**2)
                xm = (AM2 + AB2 - BM2)/(2 * AB)
                ym = sqrt(AM2 - xm**2)            
                if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
                    #M est intérieur                          
                    CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
                    CM=int(CMd + 0.0000001)
                    if abs(CM - CMd) < 0.000001:
                        #recalcul sur entiers
                        xcL = AC2 + AB2 - BC2
                        xmL = AM2 + AB2 - BM2
                        Yc2 = 4 * AB2 * AC2 - (xcL**2)  #4*AB*AB*yc*yc
                        Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
                        g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
                        if g**2 == Yc2 * Ym2:
                            nombre += 1
                            print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
                            if nombre == 1300:            
                                return
                else:
                    break

def Points_Intérieurs_2DistancesEgales(Max,Trg):
    print("     +++ Points à distances entières des sommets dont DEUX égales +++\n\n")
    nombre=0
    for p,AC,BC,AB,s in Trg:
        AC2,BC2,AB2 = AC**2,BC**2,AB**2
        b=AB-1
        for AM in range(1, b):
            AM2 = AM**2
            for BM in range(AB - AM + 1,Max):
                BM2 = BM**2
                xc = (AC2 + AB2 - BC2)/(2 * AB)
                yc = sqrt(AC2 - xc**2)
                xm = (AM2 + AB2 - BM2)/(2 * AB)
                ym = sqrt(AM2 - xm**2)            
                if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
                    #M est intérieur                          
                    CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
                    CM=int(CMd + 0.0000001)
                    if abs(CM - CMd) < 0.000001:
                        #recalcul sur entiers
                        xcL = AC2 + AB2 - BC2
                        xmL = AM2 + AB2 - BM2
                        Yc2 = 4 * AB2 * AC2 - (xcL**2)  #4*AB*AB*yc*yc
                        Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
                        g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
                        if g**2 == Yc2 * Ym2:
                            if (AM==BM or AM==CM or BM==CM):
                                nombre += 1
                                print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
                                if nombre == 300:            
                                    return
                else:
                    break

def Points_Intérieurs_TrianglesIsocèles(Max,Trg):
    print("     +++ Points des triangles isocèles à distances entières des sommets +++\n\n")
    nombre=0
    for p,AC,BC,AB,s in Trg:
        if (AB==AC or AB==BC or AC==BC) and not (AB==BC==AC):
            AC2,BC2,AB2 = AC**2,BC**2,AB**2
            b=AB-1
            for AM in range(1, b):
                AM2 = AM**2
                for BM in range(AB - AM + 1,Max):
                    BM2 = BM**2
                    xc = (AC2 + AB2 - BC2)/(2 * AB)
                    yc = sqrt(AC2 - xc**2)
                    xm = (AM2 + AB2 - BM2)/(2 * AB)
                    ym = sqrt(AM2 - xm**2)            
                    if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
                        #M est intérieur                          
                        CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
                        CM=int(CMd + 0.0000001)
                        if abs(CM - CMd) < 0.000001:
                            #recalcul sur entiers
                            xcL = AC2 + AB2 - BC2
                            xmL = AM2 + AB2 - BM2
                            Yc2 = 4 * AB2 * AC2 - (xcL**2)  #4*AB*AB*yc*yc
                            Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
                            g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
                            if g**2 == Yc2 * Ym2:
                                nombre += 1
                                print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
                                if nombre == 300:            
                                    return
                    else:
                        break

def Points_Intérieurs_TrianglesEquilatéraux(Max,Trg):
    print("     +++ Points des triangles équilatéraux à distances entières des sommets +++\n\n")
    nombre=0
    for p,AC,BC,AB,s in Trg:
        if AB==AC==BC:
            AC2,BC2,AB2 = AC**2,BC**2,AB**2
            b=AB-1
            for AM in range(1, b):
                AM2 = AM**2
                for BM in range(AB - AM + 1,Max):
                    BM2 = BM**2
                    xc = (AC2 + AB2 - BC2)/(2 * AB)
                    yc = sqrt(AC2 - xc**2)
                    xm = (AM2 + AB2 - BM2)/(2 * AB)
                    ym = sqrt(AM2 - xm**2)            
                    if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
                        #M est intérieur                          
                        CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
                        CM=int(CMd + 0.0000001)
                        if abs(CM - CMd) < 0.000001:
                            #recalcul sur entiers
                            xcL = AC2 + AB2 - BC2
                            xmL = AM2 + AB2 - BM2
                            Yc2 = 4 * AB2 * AC2 - (xcL**2)  #4*AB*AB*yc*yc
                            Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
                            g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
                            if g**2 == Yc2 * Ym2:
                                nombre += 1
                                print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
                                if nombre == 300:                                    
                                    return
                    else:
                        break

def Distances_Points_Intérieurs_trianglesDeuxPlusUn(Max,nombre,Trg):
    n=ChoixLimiteSuperieure()  
    print("\n\n       +++ Points à distances entières (moins une) des sommets +++\n\n")
    for p,AC,BC,AB,s in Trg:
        AC2,BC2,AB2 = AC**2,BC**2,AB**2
        b=AB-1
        for AM in range(1, b):
            AM2 = AM**2
            for BM in range(AB - AM + 1,Max):
                BM2 = BM**2
                xc = (AC2+AB2-BC2)/D(2*AB)
                yc = sqD(AC2 - xc**2)
                xm = (AM2 + AB2 - BM2)/D(2 * AB)
                ym = sqD(AM2 - xm**2)          
                if  ym * xc - (xm * yc) + D('0.001') <D('0') and  ym * (xc - AB) - (yc * (xm - AB)) - D('0.001') > D('0'):
                    #M est intérieur                
                    CMd = sqD((xm - xc)**2 + (ym - yc)**2)
                    CM=round(CMd)
                    if abs(CM - CMd) < D(10**(-n)):
                        xcL = AC2 + AB2 - BC2
                        xmL = AM2 + AB2 - BM2
                        Yc2 = 4 * AB2 * AC2 - (xcL**2)  #4*AB*AB*yc*yc
                        Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
                        g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
                        if g**2 != Yc2 * Ym2:
                            nombre+=1
                            print("N°","%4i" % nombre,": ","Périmètre :","%3i" % p,"*", "%3i" % AC,"%3i" % BC,"%3i" % AB,"--- ","%3i" % AM,"%3i" % BM, CMd)
                            print ("       Ecart à l'entier le plus proche :", CMd-CM,"\n")
                            flag=0
                else:
                    break
   
def AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx):
    if chx=="6":
        print("  +++ Tri à périmètre égal par aires croissantes +++\n\n")
    for p in range(minp,maxp):
        a,b=Dico[p]
        Ordre=[]
        if b-a>1:  # s'il y a plus d'un triangle de périmètre p
            Peri=Trg[a:b]  
            for i,(p,x,y,z,s)in enumerate(Peri):
                Ordre.append((i,s))
            Ordre=sorted(Ordre,key=itemgetter(1)) # tri sur 2e élément d'un tuple
            for i,(no,s) in enumerate(Ordre): # évite gestion compteur
                Trg[a+i]=Peri[no]  #remplacement par les tuples triés

    if chx =="6": # Affichage de la liste triée
        p1=minp
        for i,(p,x,y,z,s)in enumerate(Trg):
            if p!= p1:
                p1=p
                print("\n")  
            print ("Périmètre :","%3i" % p,"%3i" % x,"%3i" % y,"%3i" % z,"  Aire :",round(sqrt(s)/4,3))
    return Trg

def Tri_PerimetresEgaux_AiresEgales(minp,maxp,Trg,Dico):
    print("   +++ Triangles triés, à périmètres égal, par aires croissantes +++\n\n")
    for p in range(minp,maxp):
        a,b=Dico[p]
        Ordre=[]
        if b-a>1:  # s'il y a plus d'un triangle de périmètre p
            Peri=Trg[a:b]
            for i,(p,x,y,z,s)in enumerate(Peri):
                Ordre.append((i,s))
            Ordre=sorted(Ordre,key=itemgetter(1)) # tri sur 2e élément d'un tuple
            for i,(x,s) in enumerate(Ordre): # évite gestion compteur
                Trg[a+i]=Peri[x]  #remplacement par les tuples triés  
    n,cpt,h=len(Trg),0,0
    for i in range(n):
        j=i-1
        p0,x0,y0,z0,s0=Trg[j]
        p,x,y,z,s=Trg[i]
        if s==s0:
            h+=1
            if cpt==0: # évite de répéter le 1er triangle, si plus de deux
                print ("Aire :", round(sqrt(s)/4,3))
                print ("Périmètre :","%3i" % p0,"; côtés :","%3i" % x0,"%3i" % y0,"%3i" % z0)
            print ("Périmètre :","%3i" % p,"; côtés :","%3i" % x,"%3i" % y,"%3i" % z)
            cpt+=1
        else:
            if cpt>0:
                print()
                cpt=0
    if h==0:
        print ("\n\n         *** Pas de réponse ***\n\n")
    return

def Perimètres_et_aires_croissantes(minp,maxp,Trg,Dico):
    print("       +++ Triangles triés par aires égales (ordre croissant) +++\n\n")
    n,cpt=len(Trg),0
    Trg=sorted(Trg,key=itemgetter(4))
    for i in range(1,n):
        j=i-1
        p0,x0,y0,z0,s0=Trg[j]      
        p,x,y,z,s=Trg[i]
        if s==s0:
            if cpt==0:
                print ("Périmètre :","%3i" % p0,"%3i" % x0,"%3i" % y0,"%3i" % z0,"  Aire :",round(sqrt(s0)/4,3))
            print ("Périmètre :","%3i" % p,"%3i" % x,"%3i" % y,"%3i" % z,"  Aire :",round(sqrt(s)/4,3))
            cpt+=1
        else:
            if cpt>0:
                print()
                cpt=0
    return


# Menu
stoppe=0
while not stoppe:
    Trg,nb,nombre=[],0,0
    Dico={}
    print ("                 **************************")
    print ("                 *                        *")
    print ("                 * Tout sur les triangles *")
    print ("                 *                        *")
    print ("                 **************************")
    print ()
    print ()
    print ("             Voulez-vous lister les triangles :")
    print ()
    print ("     1. avec points intérieurs à distances entières")
    print ("     2. avec points intérieurs à distances entières dont 2 égales")
    print ("     3. isocèles avec points intérieurs à distances entières")
    print ("     4. équilatéraux avec points intérieurs à distances entières")
    print ("     5. avec points intérieurs à 2 distances entières et une 3e non")
    print ("     6. à périmètre égal, triés par aires croissantes")
    print ("     7. de même aire ET même périmètre")
    print ("     8. de mêmes aires")
    print ()
    print ("            0. Quitter le programme")
    print ()
    print ("                    **  Votre choix : ** ",end="")
    while 1:
        chx=input()
        if chx=="0":
            stoppe=1
            break
        elif chx in "1 2 3 4 5 6 7 8":
            print ("\n")
            minp,maxp=MinMax()
            Trg,Dico=Generation_des_Triangles(minp,maxp,Trg,Dico,chx)
            if chx =="1":
                print()
                Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
                Points_Intérieurs_triangles(maxp,Trg)
                break
            elif chx=="2":
                print()
                Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
                Points_Intérieurs_2DistancesEgales(maxp,Trg)
                break
            elif chx=="3":
                print()
                Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
                Points_Intérieurs_TrianglesIsocèles(maxp,Trg)
                break
            elif chx=="4":
                print()
                Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
                Points_Intérieurs_TrianglesEquilatéraux(maxp,Trg)
                break
            elif chx=="5":
                print()
                Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
                Distances_Points_Intérieurs_trianglesDeuxPlusUn(maxp,nombre,Trg)
                break              
            elif chx=="6":              
                AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
                break
            elif chx=="7":
                print ()
                Tri_PerimetresEgaux_AiresEgales(minp,maxp,Trg,Dico)
                break
            else:
                print()
                Perimètres_et_aires_croissantes(minp,maxp,Trg,Dico)
                break
        else:
            print ("Réponses attendues : 0,1,2,3,4,5,6,7 ou 8. Veuillez recommencer s'il vous plaît...")
            print ("\n")
            print ("\n")
            break
    print ("\n")
    print ("\n")

print ("                 A la prochaine !")

Il ne devrait plus rester de blagues....

Au fait, si les deux dernières décimales sont fausses cela signifie que les calculs sont donc précis à 10-23 près et non pas 10-25 comme je je le pensais.
Comme jusqu'à p =180 je n'ai pas trouvé de triangle (option 5) pour une limite supérieure de 10-10, je pense qu'il y a donc encore de la marge...

@+

[EDIT]
Le moteur du forum me rajoute systématiquement les balises url et /url de part et d'autre de l'adresse mail :
je les supprime, je clique sur Valider et hop... les revoilà !

Dernière modification par yoshi (21-07-2014 13:17:16)

Hors ligne

#133 21-07-2014 12:43:49

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

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

Salutation,

Je n'ai pas beaucoup de temps à moi aujourd'hui!

J'ai testé ton dernier né il roule bien!
Il me semble plus véloce qu'avant dans certaines options on dirait.

yoshi a écrit :

Bon, il y a deux fois le même, mais - c'est marrant - aussi un "vilain petit canard"...

Lequel?

yoshi a écrit :

Et je constate - sans trop de surprise que mes options 2 et 3 ne donnent pas les mêmes résultats, même si quelque chose me chiffonne sans pouvoir mettre le doigt dessus...

J'ai fait le même constat:

                    **  Votre choix : ** 2
            +++ Choix des périmètres mini et maxi +++
Perimètre minimim souhaité ?  3
Perimètre maximum souhaité ?  80
     +++ Points à distances entières des sommets dont DEUX égales +++

N°    1  :  Périmètre :  54  *  15  15  24  ---   13  13   4
N°    2  :  Périmètre :  64  *  20  20  24  ---   13  13  11
N°    3  :  Périmètre :  64  *  20  20  24  ---   15  15   7
N°    4  :  Périmètre :  80  *  25  25  30  ---   17  17  12


                    **  Votre choix : ** 3
            +++ Choix des périmètres mini et maxi +++
Perimètre minimim souhaité ?  3
Perimètre maximum souhaité ?  80
     +++ Points des triangles isocèles à distances entières des sommets +++

N°    1  :  Périmètre :  50  *  16  17  17  ---   10   9  10
N°    2  :  Périmètre :  54  *  15  15  24  ---   13  13   4
N°    3  :  Périmètre :  64  *  20  20  24  ---   13  13  11
N°    4  :  Périmètre :  64  *  20  20  24  ---   15  15   7
N°    5  :  Périmètre :  80  *  25  25  30  ---   17  17  12


>>>>  Périmètre :  50  *  16  17  17  ---   10   9  10  aurait dû aussi apparaître parmi les résultats du choix n°2

Je ne comprends pas bien...


yoshi a écrit :

Au fait, si les deux dernières décimales sont fausses cela signifie que les calculs sont donc précis à 10-23 près et non pas 10-25 comme je je le pensais.
Comme jusqu'à p =180 je n'ai pas trouvé de triangle (option 5) pour une limite supérieure de 10-10, je pense qu'il y a donc encore de la marge...

Oui, j'ai pour le moment vérifié les résultats jusqu'à p = 260, il n'y a toujours pas de n>10.

___________________


Tu n'as toujours pas d'explication concernant le fait qu'aucun écart négatif n'apparaît?



@+

Hors ligne

#134 21-07-2014 12:59:40

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

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

Re,

Ecart négatif. Non, pas trouvé... En théorie, il devrait en apparaître.
Il faudrait que je crée un autre programme (fastidieux à la main !) récupérant les données AC,BC,AB,AM,BM et recalculer indépendamment des calculs du module de totomm, la 6e valeur et la comparer systématiquement avec celle trouvée dans le module totomm

Vilain petit canard :

N°    1  :  Périmètre :  50  *  16  17  17  ---   10   9  10
N°    2  :  Périmètre :  54  *  15  15  24  ---   13  13   4
N°    3  :  Périmètre :  64  *  20  20  24  ---   13  13  11
N°    4  :  Périmètre :  64  *  20  20  24  ---   15  15   7
N°    5  :  Périmètre :  80  *  25  25  30  ---   17  17  12
N°    6  :  Périmètre :  91  *  13  39  39  ---    8  33   9
N°    7  :  Périmètre :  91  *  13  39  39  ---    9  33   8

N°    8  :  Périmètre :  98  *  24  37  37  ---   13  30  13
N°    9  :  Périmètre :  98  *  24  37  37  ---   15  26  15
N°   10  :  Périmètre :  98  *  24  37  37  ---   20  19  20
N°   11  :  Périmètre :  98  *  29  29  40  ---   25  25   6
N°   12  :  Périmètre : 100  *  26  26  48  ---   25  25   3
N°   13  :  Périmètre : 100  *  18  41  41  ---   15  28  15
N°   14  :  Périmètre : 100  *  32  34  34  ---   20  18  20

A part que c'est un doublon, c'est le seul dont deux distances intérieures ne sont pas égales...

Pb "chiffonnant".
Oui, c'est bien que j'avais cru voir...
Maintenant, c'est identifié formellement.
Je vais donc pouvoir y réfléchir sérieusement : a priori, cela ne devrait pas être, aucune raison logique et je n'ai vu ni méprise ni faute de programmation.
Je ne vois plus que la génération préalable des triangles et j'en serais encore plus surpris...

Voilà de quoi affûter mes neurones...

@+

Hors ligne

#135 21-07-2014 13:08:22

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

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

RE,

EUREKA !!!
ligne 136
corriger if (AM==BM or AM==BC or BM==CM):  en if (AM==BM or AM==CM or BM==CM).
Je rectifie la ligne incriminée dans le code du post #132...

Voilà, je ne suis plus chiffonné !

Quant au vilain petit canard les valeurs 8 et 9 ne sont pas si loin !

@+

[EDIT]
Si tu lances Python avec l'IDLE de windows :
- Dans la fenêtre des résultats, clique sur le menu  Options
- Clique sur Configure IDLE
- Ouvre l'onglet Général
   et passe Initial Window Size (in characters)    Width de 80 à 90
- puis ok : la prochaine fois tu seras plus confortable...

Dernière modification par yoshi (21-07-2014 13:27:27)

Hors ligne

#136 21-07-2014 14:36:41

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

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

Re,
Modification faite, et un problème réglé de plus!
(Bien vu pour le vilain petit coin coin!)

J'ai testé pour voir avec AM == BM == CM (donc avec cette fois les trois distances internes égales) et je ne tombe pour le moment que sur deux triangles:
N°    1  :  Périmètre : 128  *  40  40  48  ---   25  25  25
N°    2  :  Périmètre : 256  *  80  80  96  ---   50  50  50
qui sont en réalité le même, le deuxième a simplement ces dimensions AB, BC, AC, AM, BM et CM doublées...

___________

Idée: en plus des doublons évoqués on pourrait aussi supprimer les cas de figures qui ne sont en réalité que des agrandissements conservant la forme d'autres déjà apparus.


@+

Hors ligne

#137 21-07-2014 14:38:28

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

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

Re,

Bin, voilà qui prouve que le prog calcule juste...
Pour les triangles équilatéraux, j'ai testé p= 819, il retrouve bien les 3 longueurs obtenues dans le fil qui t'a amené ici et en 6 exemplaires :
si x, y, z sont ces distances, j'obtiens - logiquement - x, y, z ; x, z, y ; y, x, z ; y, z, x ; z, x, y et z, y, x...

Je réfléchis aux doublons, ce devrait être jouable sans trop de ralentissement, pour les multiples, ça obligerait à conserver une palanquée de solutions.. M'enfin, je n'exclus rien a priori.

Tiens, c'est marrant, ton triangle avec point intérieur équidistant est isocèle !

Autre remarque, a priori encore avec 2 distances égales entières dans les triangles, on dirait bien qu'il s'agisse toujours des distances du point intérieur aux extrémités de la base.
Si je place un point sur la médiatrice de la base d'un tr. isocèle, il sera équidistant des extrémités, là rien de nouveau, mais que si un point intérieur est à distances égales entières de 2 sommets d'un triangle isocèle, les 2 sommets constituent la base de ce triangle est autre chose...
A vérifier.

@+

Hors ligne

#138 21-07-2014 15:52:04

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

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

Re,


Remplacer l'ancienne def par celle-là :

def Points_Intérieurs_TrianglesIsocèles(Max,Trg):
    print("     +++ Points des triangles isocèles à distances entières des sommets +++\n\n")
    nombre=0
    for p,AC,BC,AB,s in Trg:
        if (AB==AC or AB==BC or AC==BC) and not (AB==BC==AC):
            AC2,BC2,AB2 = AC**2,BC**2,AB**2
            b=AB-1
            L=[]
            for AM in range(1, b):
                AM2 = AM**2
                for BM in range(AB - AM + 1,Max):
                    BM2 = BM**2
                    xc = (AC2 + AB2 - BC2)/(2 * AB)
                    yc = sqrt(AC2 - xc**2)
                    xm = (AM2 + AB2 - BM2)/(2 * AB)
                    ym = sqrt(AM2 - xm**2)            
                    if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
                        #M est intérieur                          
                        CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
                        CM=int(CMd + 0.0000001)
                        if abs(CM - CMd) < 0.000001:
                            #recalcul sur entiers
                            xcL = AC2 + AB2 - BC2
                            xmL = AM2 + AB2 - BM2
                            Yc2 = 4 * AB2 * AC2 - (xcL**2)  #4*AB*AB*yc*yc
                            Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
                            g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
                            if g**2 == Yc2 * Ym2:
                                if [AM,BM,CM] not in L:                                
                                    nombre += 1
                                    print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)                                
                                    L.append([AM,BM,CM])
                                    L.append([AM,CM,BM])
                                    L.append([BM,AM,CM])
                                    L.append([BM,CM,AM])
                                    L.append([CM,AM,BM])
                                    L.append([CM,BM,AM])
                                    if nombre == 300:            
                                        return
                    else:
                        break

Plus de doublons dans les tr. isocèles...

Maintenant, je vais chercher pour quelles options il y avait aussi des doublons...

@+

Hors ligne

#139 21-07-2014 17:32:07

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

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

Bonsoir,

Merci, je modifie...


Avec les trois distances internes égales je trouve aussi:

N°    3  :  Périmètre : 324  *  78 120 126  ---   65  65  65
N°    4  :  Périmètre : 336  * 104 112 120  ---   65  65  65

   et

N°    5  :  Périmètre : 384  * 120 120 144  ---   75  75  75       (de même forme que n°1 et n°2)


Cette configuration semble presque aussi rare que celle avec AB = BC = AC



@+

Hors ligne

#140 21-07-2014 18:08:41

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

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

Re,

Si un point intérieur est à distances entières des trois sommets d'un triangle isocèle et si deux de ces distances sont égales, alors il semble que les 2 sommets desquels ce point est équidistant, sont ceux appartenant à la base de ce triangle...

Voici formulée ce qui qui sera peut-être un jour connu comme la fameuse "conjecture de yoshi".

;)

Hors ligne

#141 22-07-2014 09:55:26

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

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

Bien le bonjour,

J'ai réécrit en partie le menu, rajouté une suppression de doublons, déplacé une option dans le menu pour faire de la place pour en mettre une autre...
L'option supplémentaire est de ne traiter que, pour les points à distances entières, les triangles scalènes en excluant les isocèles.
Quid des triangles rectangles ?

#!/usr/bin/python
# -*- coding: UTF-8 -*-

from math import sqrt
from operator import itemgetter
from decimal import *
D=Decimal
getcontext().prec=25


def sqD(x):
# Calcul de la racine carrée de x
# D'après [url]http://python.jpvweb.com/mesrecettespython/doku.php?id=math_decimal[/url]
    if type(x)!=type(Decimal):
        x = D(str(x))
    return x.sqrt()

def MinMax():
    print ("            +++ Choix des périmètres mini et maxi +++\n")
    while 1:
        mini=input("Périmètre minimum souhaité ?  ")
        try:
            minp=int(mini)
            break
        except ValueError:
            print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")            
    while 1:
        maxi=input("Perimètre maximum souhaité ?  ")
        try:
            maxp=int(maxi)+1
            if maxp<=minp:
                print ("Erreur,le maximum doit être supérieur au mini. Veuillez recommencer S.V.P..\n\n")
            else:
                break
        except ValueError:
            print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")
    print("\n\n")
    return minp,maxp

def ChoixLimiteSuperieure():
    print ("\n            +++ Choix de la limite supérieure +++\n")
    while 1:
        nn=input("Limite supérieure souhaitée entre 1 et 15 ?  ")
        try:
            n=int(nn)
            if n>0 and n<16:
                break
            else:
                print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")          
        except ValueError:
            print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")
    return n

def Generation_des_Triangles(minp,maxp,Trg,Dico,chx):
    nb,s=0,0
    for p in range(minp,maxp): # p est le périmètre
        nb1=nb
        for AC in range(1,maxp): # AC sera limité bien avant maxp
            BC=(p-AC)//2 # division euclidienne
            if BC<AC:
                break # AC est trop grand, passer à la valeur suivante de AC
            AB=p-AC-BC
            while 1: # boucle pour tous les triangles tels que AC<=BC<=AB
                if AB>=AC+BC: # le triangle n'existe pas
                    break # donc sortie de la boucle while...      
                nb+=1
                s=p*(p-2*AB)*(p-2*AC)*(p-2*BC)
                Trg.append((p,AC,BC,AB,s))  # Stockage du quintuplet trouvé
                BC-=1 #triangle suivant de même périmètre
                AB+=1
                if BC<AC:
                    break
        Dico.update({p:[nb1,nb]})  # je complète mon dictionnaire
    return Trg,Dico

def Points_Intérieurs_triangles(Max,Trg):
    print("       +++ Points intérieurs à distances entières des sommets +++\n\n")
    nombre=0
    for p,AC,BC,AB,s in Trg:
        AC2,BC2,AB2 = AC**2,BC**2,AB**2
        b,L=AB-1,[]
        for AM in range(1, b):
            AM2,db = AM**2,AB-AM+1
            for BM in range(db,Max):
                BM2 = BM**2
                xc = (AC2 + AB2 - BC2)/(2 * AB)
                yc = sqrt(AC2 - xc**2)
                xm = (AM2 + AB2 - BM2)/(2 * AB)
                ym = sqrt(AM2 - xm**2)            
                if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
                    #M est intérieur                          
                    CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
                    CM=round(CMd)   #CM=int(CMd + 0.0000001)
                    if abs(CM - CMd) < 0.0001:
                        #recalcul sur entiers
                        xcL = AC2 + AB2 - BC2
                        xmL = AM2 + AB2 - BM2
                        Yc2 = 4 * AB2 * AC2 - (xcL**2)  #4*AB*AB*yc*yc
                        Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
                        g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
                        if g**2 == Yc2 * Ym2:
                            if [AM,BM,CM] not in L:                                
                                nombre += 1
                                print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)                                
                                L+=[[AM,BM,CM],[AM,CM,BM],[BM,AM,CM],[BM,CM,AM],[CM,AM,BM],[CM,BM,AM]]
                                if nombre == 300:            
                                    return                
                else:
                    break

def Points_Intérieurs_TrianglesScalènes(Max,Trg):
    print("   +++ Triangles scalènes : points intérieurs à distances entières des sommets +++\n\n")
    nombre=0
    for p,AC,BC,AB,s in Trg:
        if not (AB==AC or AC==BC or AB==BC):
            AC2,BC2,AB2 = AC**2,BC**2,AB**2
            b=AB-1
            for AM in range(1, b):
                AM2,db = AM**2,AB-AM+1
                for BM in range(db,Max):
                    BM2 = BM**2
                    xc = (AC2 + AB2 - BC2)/(2 * AB)
                    yc = sqrt(AC2 - xc**2)
                    xm = (AM2 + AB2 - BM2)/(2 * AB)
                    ym = sqrt(AM2 - xm**2)            
                    if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
                        #M est intérieur                          
                        CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
                        CM=round(CMd)   #CM=int(CMd + 0.0000001)
                        if abs(CM - CMd) < 0.0001:
                            #recalcul sur entiers
                            xcL = AC2 + AB2 - BC2
                            xmL = AM2 + AB2 - BM2
                            Yc2 = 4 * AB2 * AC2 - (xcL**2)  #4*AB*AB*yc*yc
                            Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
                            g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
                            if g**2 == Yc2 * Ym2:
                                nombre += 1
                                print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
                                if nombre == 1300:            
                                    return
                    else:
                        break

def Points_Intérieurs_TrianglesIsocèles(Max,Trg):
    print("     +++ Points des triangles isocèles à distances entières des sommets +++\n\n")
    nombre=0
    for p,AC,BC,AB,s in Trg:
        if (AB==AC or AB==BC or AC==BC) and not (AB==BC==AC):
            AC2,BC2,AB2 = AC**2,BC**2,AB**2
            b=AB-1
            L=[]
            for AM in range(1, b):
                AM2,db = AM**2,AB-AM+1
                for BM in range(db,Max):
                    BM2 = BM**2
                    xc = (AC2 + AB2 - BC2)/(2 * AB)
                    yc = sqrt(AC2 - xc**2)
                    xm = (AM2 + AB2 - BM2)/(2 * AB)
                    ym = sqrt(AM2 - xm**2)            
                    if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
                        #M est intérieur                          
                        CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
                        CM=round(CMd)    #CM=int(CMd + 0.0000001)
                        if abs(CM - CMd) < 0.0001:
                            #recalcul sur entiers
                            xcL = AC2 + AB2 - BC2
                            xmL = AM2 + AB2 - BM2
                            Yc2 = 4 * AB2 * AC2 - (xcL**2)  #4*AB*AB*yc*yc
                            Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
                            g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
                            if g**2 == Yc2 * Ym2:
                                if [AM,BM,CM] not in L:                                
                                    nombre += 1
                                    print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)                                
                                    L+=[[AM,BM,CM],[AM,CM,BM],[BM,AM,CM],[BM,CM,AM],[CM,AM,BM],[CM,BM,AM]]
                                    if nombre == 300:            
                                        return
                    else:
                        break

def Points_Intérieurs_TrianglesEquilatéraux(Max,Trg):
    print("     +++ Points des triangles équilatéraux à distances entières des sommets +++\n\n")
    nombre=0
    for p,AC,BC,AB,s in Trg:
        if AB==AC==BC:
            AC2,BC2,AB2 = AC**2,BC**2,AB**2
            b=AB-1
            for AM in range(1, b):
                AM2 = AM**2
                for BM in range(AB - AM + 1,Max):
                    BM2 = BM**2
                    xc = (AC2 + AB2 - BC2)/(2 * AB)
                    yc = sqrt(AC2 - xc**2)
                    xm = (AM2 + AB2 - BM2)/(2 * AB)
                    ym = sqrt(AM2 - xm**2)            
                    if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
                        #M est intérieur                          
                        CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
                        CM=int(CMd + 0.0000001)
                        if abs(CM - CMd) < 0.000001:
                            #recalcul sur entiers
                            xcL = AC2 + AB2 - BC2
                            xmL = AM2 + AB2 - BM2
                            Yc2 = 4 * AB2 * AC2 - (xcL**2)  #4*AB*AB*yc*yc
                            Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
                            g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
                            if g**2 == Yc2 * Ym2:
                                nombre += 1
                                print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
                                if nombre == 300:                                    
                                    return
                    else:
                        break

def Points_Intérieurs_2DistancesEgales(Max,Trg):
    print("     +++ Points à distances entières des sommets dont DEUX égales +++\n\n")
    nombre=0
    for p,AC,BC,AB,s in Trg:
        AC2,BC2,AB2 = AC**2,BC**2,AB**2
        b=AB-1
        for AM in range(1, b):
            AM2,db = AM**2,AB-AM+1
            for BM in range(db,Max):
                BM2 = BM**2
                xc = (AC2 + AB2 - BC2)/(2 * AB)
                yc = sqrt(AC2 - xc**2)
                xm = (AM2 + AB2 - BM2)/(2 * AB)
                ym = sqrt(AM2 - xm**2)            
                if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
                    #M est intérieur                          
                    CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
                    CM=round(CMd)   #CM=int(CMd + 0.0000001)
                    if abs(CM - CMd) < 0.000001:
                        #recalcul sur entiers
                        xcL = AC2 + AB2 - BC2
                        xmL = AM2 + AB2 - BM2
                        Yc2 = 4 * AB2 * AC2 - (xcL**2)  #4*AB*AB*yc*yc
                        Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
                        g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
                        if g**2 == Yc2 * Ym2:
                            if (AM==BM or AM==CM or BM==CM):
                                nombre += 1
                                print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
                else:
                    break

def Distances_Points_Intérieurs_trianglesDeuxPlusUn(Max,nombre,Trg):
    n=ChoixLimiteSuperieure()  
    print("\n\n       +++ Points à distances entières (moins une) des sommets +++\n\n")
    for p,AC,BC,AB,s in Trg:
        AC2,BC2,AB2 = AC**2,BC**2,AB**2
        b=AB-1
        L=[]
        for AM in range(1, b):
            AM2 = AM**2
            for BM in range(AB - AM + 1,Max):
                BM2 = BM**2
                xc = (AC2+AB2-BC2)/D(2*AB)
                yc = sqD(AC2 - xc**2)
                xm = (AM2 + AB2 - BM2)/D(2 * AB)
                ym = sqD(AM2 - xm**2)          
                if  ym * xc - (xm * yc) + D('0.001') <D('0') and  ym * (xc - AB) - (yc * (xm - AB)) - D('0.001') > D('0'):
                    #M est intérieur                
                    CMd = sqD((xm - xc)**2 + (ym - yc)**2)
                    CM=round(CMd)
                    if abs(CM - CMd) < D(10**(-n)):
                        xcL = AC2 + AB2 - BC2
                        xmL = AM2 + AB2 - BM2
                        Yc2 = 4 * AB2 * AC2 - (xcL**2)  #4*AB*AB*yc*yc
                        Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
                        g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
                        if g**2 != Yc2 * Ym2:                              
                            nombre+=1
                            print("N°","%4i" % nombre,": ","Périmètre :","%3i" % p,"*", "%3i" % AC,"%3i" % BC,"%3i" % AB,"--- ","%3i" % AM,"%3i" % BM, CMd)
                            print ("       Ecart à l'entier le plus proche :", CMd-CM,"\n")                                
                else:
                    break
   
def AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx):
    if chx=="7":
        print("  +++ Tri à périmètre égal par aires croissantes +++\n\n")
    for p in range(minp,maxp):
        a,b=Dico[p]
        Ordre=[]
        if b-a>1:  # s'il y a plus d'un triangle de périmètre p
            Peri=Trg[a:b]  
            for i,(p,x,y,z,s)in enumerate(Peri):
                Ordre.append((i,s))
            Ordre=sorted(Ordre,key=itemgetter(1)) # tri sur 2e élément d'un tuple
            for i,(no,s) in enumerate(Ordre): # évite gestion compteur
                Trg[a+i]=Peri[no]  #remplacement par les tuples triés

    if chx =="7": # Affichage de la liste triée
        p1=minp
        for i,(p,x,y,z,s)in enumerate(Trg):
            if p!= p1:
                p1=p
                print("\n")  
            print ("Périmètre :","%3i" % p,"%3i" % x,"%3i" % y,"%3i" % z,"  Aire :",round(sqrt(s)/4,3))
    return Trg

def Tri_PerimetresEgaux_AiresEgales(minp,maxp,Trg,Dico):
    print("   +++ Triangles triés, à périmètres égal, par aires croissantes +++\n\n")
    for p in range(minp,maxp):
        a,b=Dico[p]
        Ordre=[]
        if b-a>1:  # s'il y a plus d'un triangle de périmètre p
            Peri=Trg[a:b]
            for i,(p,x,y,z,s)in enumerate(Peri):
                Ordre.append((i,s))
            Ordre=sorted(Ordre,key=itemgetter(1)) # tri sur 2e élément d'un tuple
            for i,(x,s) in enumerate(Ordre): # évite gestion compteur
                Trg[a+i]=Peri[x]  #remplacement par les tuples triés  
    n,cpt,h=len(Trg),0,0
    for i in range(n):
        j=i-1
        p0,x0,y0,z0,s0=Trg[j]
        p,x,y,z,s=Trg[i]
        if s==s0:
            h+=1
            if cpt==0: # évite de répéter le 1er triangle, si plus de deux
                print ("Aire :", round(sqrt(s)/4,3))
                print ("Périmètre :","%3i" % p0,"; côtés :","%3i" % x0,"%3i" % y0,"%3i" % z0)
            print ("Périmètre :","%3i" % p,"; côtés :","%3i" % x,"%3i" % y,"%3i" % z)
            cpt+=1
        else:
            if cpt>0:
                print()
                cpt=0
    if h==0:
        print ("\n\n         *** Pas de réponse ***\n\n")
    return

def Perimètres_et_aires_croissantes(minp,maxp,Trg,Dico):
    print("       +++ Triangles triés par aires égales (ordre croissant) +++\n\n")
    n,cpt=len(Trg),0
    Trg=sorted(Trg,key=itemgetter(4))
    for i in range(1,n):
        j=i-1
        p0,x0,y0,z0,s0=Trg[j]      
        p,x,y,z,s=Trg[i]
        if s==s0:
            if cpt==0:
                print ("Périmètre :","%3i" % p0,"%3i" % x0,"%3i" % y0,"%3i" % z0,"  Aire :",round(sqrt(s0)/4,3))
            print ("Périmètre :","%3i" % p,"%3i" % x,"%3i" % y,"%3i" % z,"  Aire :",round(sqrt(s)/4,3))
            cpt+=1
        else:
            if cpt>0:
                print()
                cpt=0
    return


# Menu
stoppe=0
while not stoppe:
    Trg,nb,nombre=[],0,0
    Dico={}
    print ("                 **************************")
    print ("                 *                        *")
    print ("                 * Tout sur les triangles *")
    print ("                 *                        *")
    print ("                 **************************")
    print ()
    print ()
    print ("             Voulez-vous lister les triangles :")
    print ()
    print ("     1. avec points intérieurs à distances entières")
    print ("     2. avec points intérieurs à distances entières (Triangles Scalènes)")    
    print ("     3. isocèles avec points intérieurs à distances entières")
    print ("     4. équilatéraux avec points intérieurs à distances entières")
    print ("     5. avec points intérieurs à distances entières dont 2 égales")
    print ("     6. avec points intérieurs à 2 distances entières et une 3e non")
    print ("     7. à périmètre égal, triés par aires croissantes")
    print ("     8. de même aire ET même périmètre")
    print ("     9. de mêmes aires")
    print ()
    print ("            0. Quitter le programme")
    print ()
    print ("                    **  Votre choix : ** ",end="")
    while 1:
        chx=input()
        if chx=="0":
            stoppe=1            
        elif chx in "1 2 3 4 5 6 7 8 9":
            print ("\n")
            minp,maxp=MinMax()
            Trg,Dico=Generation_des_Triangles(minp,maxp,Trg,Dico,chx)
            print()
            if chx =="1":
                Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
                Points_Intérieurs_triangles(maxp,Trg)              
            elif chx=="2":
                Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
                Points_Intérieurs_TrianglesScalènes(maxp,Trg)                                        
            elif chx=="3":
                Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
                Points_Intérieurs_TrianglesIsocèles(maxp,Trg)                
            elif chx=="4":
                Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
                Points_Intérieurs_TrianglesEquilatéraux(maxp,Trg)
            elif chx=="5":
                Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
                Points_Intérieurs_2DistancesEgales(maxp,Trg)                  
            elif chx=="6":
                Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
                Distances_Points_Intérieurs_trianglesDeuxPlusUn(maxp,nombre,Trg)                              
            elif chx=="7":              
                AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)                
            elif chx=="8":
                Tri_PerimetresEgaux_AiresEgales(minp,maxp,Trg,Dico)              
            else:
                Perimètres_et_aires_croissantes(minp,maxp,Trg,Dico)
            break
        else:
            print ("Réponses attendues : 0,1,2,3,4,5,6,7, 8 ou 9. Veuillez recommencer s'il vous plaît...")
            print ("\n")
            print ("\n")
        break
    print ("\n")
    print ("\n")

print ("                 A la prochaine !")

Petite curiosité (extrait non exaustif) déjà constatée hier:

Périmètre :  78  *  23  27  28  ---   18  20   8
Périmètre :  78  *  24  26  28  ---   17  21   8

Périmètre :  98  *  16  39  43  ---   13  34   7
Périmètre :  98  *  17  38  43  ---   12  35   7

Périmètre :  91  *  13  39  39  ---    8  33   9
Périmètre :  91  *  14  38  39  ---    8  34   8

Périmètre :  98  *  16  38  44  ---   12  34   8
Périmètre :  98  *  16  39  43  ---   13  34   7

-----------------------------------------------

Périmètre :  64  *  18  20  26  ---   15  13   9
Périmètre :  64  *  20  20  24  ---   13  13  11

Périmètre :  78  *  24  26  28  ---   17  21   8
Périmètre :  80  *  25  25  30  ---   17  17  12

Périmètre :  88  *  26  30  32  ---   19  15  18
Périmètre :  90  *  20  31  39  ---   19  22  11

On peut faire la même remarque pour chaque paire de lignes que je t'ai sélectionnées, c'est encore plus curieux pour les 4 premières paires sélectionnées...  ;-)

@+

Hors ligne

#142 22-07-2014 11:10:15

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

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

Salut yoshi,

Il y a des bugs:
- Quand on choisit l'option 6 c'est la 7 qui s'ouvre
- Quand par contre on choisit l'option 7 rien ne se passe...
J'ai essayé de faire les modifications par moi-même, mais je n'arrive pas à résoudre les problèmes.


@+

Hors ligne

#143 22-07-2014 11:28:51

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

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

Nan,

Quand on choisit 6. 2 distances intérieures et une non c'est bien la 6 qui s'ouvre :

**  Votre choix : ** 6


            +++ Choix des périmètres mini et maxi +++

Périmètre minimum souhaité ?  50
Perimètre maximum souhaité ?  60


            +++ Choix de la limite supérieure +++

Limite supérieure souhaitée entre 1 et 15 ?  6


       +++ Points à distances entières (moins une) des sommets +++


N°    1 :  Périmètre :  51 *  11  19  21 ---   12  13 6.000000704054773214988985
       Ecart à l'entier le plus proche : 7.04054773214988985E-7

N°    2 :  Périmètre :  54 *   7  23  24 ---   13  12 11.00000084100341695665260
       Ecart à l'entier le plus proche : 8.4100341695665260E-7

N°    3 :  Périmètre :  55 *  16  19  20 ---   15  12 7.000000350647113856285487
       Ecart à l'entier le plus proche : 3.50647113856285487E-7

N°    4 :  Périmètre :  55 *  17  18  20 ---    2  19 15.00000086121537984060985
       Ecart à l'entier le plus proche : 8.6121537984060985E-7

N°    5 :  Périmètre :  58 *  13  21  24 ---    5  22 8.000000547323810974432554
       Ecart à l'entier le plus proche : 5.47323810974432554E-7

N°    6 :  Périmètre :  60 *  16  22  22 ---   17   8 14.00000091382957315268276
       Ecart à l'entier le plus proche : 9.1382957315268276E-7

.
Pour le point 7, aller ligne 294 et remplacer 6 par 7 (oubli de rectifier ce matin):
if chx =="6": # Affichage de la liste triée
par
if chx =="7": # Affichage de la liste triée

Je rectifie dans mon post
Dans l'IDLE de Python : taper ALT + G et n°294 tu iras de suite...

@+

Hors ligne

#144 22-07-2014 11:33:16

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

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

Re,

yoshi a écrit :

J'ai réécrit en partie le menu, rajouté une suppression de doublons

Très bonne chose!

yoshi a écrit :

L'option supplémentaire est de ne traiter que, pour les points à distances entières, les triangles scalènes..

Comme l'avait fait totomm au début, c'est bien oui.

yoshi a écrit :

Quid des triangles rectangles ?

Bonne question! Ce n'est pas sûr qu'il y en ait... C'est à vérifier, bonne idée! ;)

yoshi a écrit :

On peut faire la même remarque pour chaque paire de lignes que je t'ai sélectionnées, c'est encore plus curieux pour les 4 premières paires sélectionnées...  ;-)

Intéressant...  J'ai aussi remarqué ce genre de 'structure', je pense qu'il y a beaucoup de choses comme cela à explorer...

L'on doit aussi probablement pouvoir en déduire des règles assez simples permettant de générer des cas.  A vérifier également...


@+

Dernière modification par 0^0 (22-07-2014 11:54:03)

Hors ligne

#145 22-07-2014 11:38:58

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

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

Re,

Correction faite, tout marche!!

(je n'avais pas vu...)

:)

@+

Hors ligne

#146 22-07-2014 12:40:13

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

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

J'ai testé !

Triangles rectangles : de 20 à 120 : rien !
De 120 à 180 : 3

N°    43  :  Périmètre : 150  *  25  60  65  ---   12  55  17  R
N°    57  :  Périmètre : 156  *  39  52  65  ---   34  33  25  R
N°  123  :  Périmètre : 176  *  48  55  73  ---   26  51  26  R

Les 2 premiers sont des triplets pythagoriciens : respectivement multiples de 5,12,13 et 3,4,5.
Le 3e est original (73 premier).
Je te mets le remplaçant du 1er module :

def Points_Intérieurs_triangles(Max,Trg):
    print("       +++ Points intérieurs à distances entières des sommets +++\n\n")
    nombre=0
    for p,AC,BC,AB,s in Trg:
        AC2,BC2,AB2 = AC**2,BC**2,AB**2        
        b,L=AB-1,[]
        R,r=sorted([AC2,BC2,AB2]),""
        if R[2]==R[1]+R[0]:
            r=" R"
        for AM in range(1, b):
            AM2,db = AM**2,AB-AM+1
            for BM in range(db,Max):
                BM2 = BM**2
                xc = (AC2 + AB2 - BC2)/(2 * AB)
                yc = sqrt(AC2 - xc**2)
                xm = (AM2 + AB2 - BM2)/(2 * AB)
                ym = sqrt(AM2 - xm**2)            
                if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
                    #M est intérieur                          
                    CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
                    CM=round(CMd)   #CM=int(CMd + 0.0000001)
                    if abs(CM - CMd) < 0.0001:
                        #recalcul sur entiers
                        xcL = AC2 + AB2 - BC2
                        xmL = AM2 + AB2 - BM2
                        Yc2 = 4 * AB2 * AC2 - (xcL**2)  #4*AB*AB*yc*yc
                        Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
                        g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
                        if g**2 == Yc2 * Ym2:
                            if [AM,BM,CM] not in L:                                
                                nombre += 1
                                print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM,r)                                
                                L+=[[AM,BM,CM],[AM,CM,BM],[BM,AM,CM],[BM,CM,AM],[CM,AM,BM],[CM,BM,AM]]
                                if nombre == 1300:            
                                    return                
                else:
                    break

Méthode :
* comme on dispose déjà des carrés, je les mets dans une liste que je trie par ordre croissant et j'appelle R cette liste triée
* j'initialise la variable r à "" (vide)
* je teste alors si R[2]=R[1]+R[0]
   si oui, r prend la valeur " R", sinon r reste vide
* j'ajoute simplement ensuite la variable r à la ligne des infos imprimées...

Comme il n'y en a que très peu, inutile de rajouter une option pour ça, je trouve que la mention R en bout de ligne suffit...

Remarque : 3e ex, le point M est sur la médiatrice d'un côté de l'angle droit (et pas l'hypoténuse !?)

@+

[EDIT]

Périmètre : 208  *  39  80  89  ---   50  41  41  R
Périmètre : 276  *  69  92 115  ---   52  75  29  R
Périmètre : 280  *  80  84 116  ---   41  85  41  R

Surprise pour p = 300 :

Périmètre : 300  *  50 120 130  ---   24 110  34  R
Périmètre : 300  *  75 100 125  ---   36  91  51  R
Périmètre : 300  *  75 100 125  ---   78  53  51  R

Dernière modification par yoshi (22-07-2014 13:47:28)

Hors ligne

#147 22-07-2014 13:52:52

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

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

Re,

J'ai rajouté l'option, tout roule.

Intéressant tout ça!

Je vais maintenant essayer de vérifier si la conjecture de yoshi tient.


@+

Hors ligne

#148 22-07-2014 14:20:14

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

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

Ave,

Après, il n'y a qu'un triangle rectangle jusqu'à p=350
(j'ai testé par ranches de 5, sinon, c'est très long)

Périmètre : 312  *  78 104 130  ---   68  66  50  R

Ah, oui, ma "conjecture"...
Si tu la vérifiais sur des exemples supplémentaires, je ne vois pas comment on pourrait la démontrer...

Le temps ayant passé, je me hasarde à te dire :
On est loin de ta recherche "parlante" d'une formule mathématique, hein ?
Je pense que tu constates que l'informatique t'apporte sur un plateau en quelques minutes (sans erreur de calcul et sans effort - sinon de patience -) des infos sur les triangles dont tu n'avais probablement même pas rêvé avant !!

@+

Hors ligne

#149 22-07-2014 14:43:03

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

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

Re,

Quand je me proposais de vérifier que ta conjecture tient ce n'était pas dans mon esprit la démontrer ni donc prouver qu'elle tiendra toujours... En effet, je sais très bien qu'il suffit d'un cas qui ne colle pas pour l'infirmer... Je voulais juste voir si avec un peu de patience je ne pouvais pas tomber sur un tel cas...

Pour ce qui est de la formule, je ne désespère pas! En effet, je crois que l'observation de 'structures' dans les cas de figure que nous donne ici l'informatique pourrait nous mettre sur une piste.   


@+


[EDIT] question supprimée:  j'ai trouvé ma réponse, merci yoshi.

Dernière modification par 0^0 (22-07-2014 15:38:10)

Hors ligne

#150 22-07-2014 15:01:06

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

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

Re,

Quelle option ?
S'il s'agit de la def, on copie celle fournie supra, on va dans l'IDLE Python, on sélectionne cette def et on fait : "coller"

Sinon prog complet avec affichage éventuel du " R" pendant l'exécution de l'item 1 :

#!/usr/bin/python
# -*- coding: UTF-8 -*-

from math import sqrt
from operator import itemgetter
from decimal import *
D=Decimal
getcontext().prec=25


def sqD(x):
# Calcul de la racine carrée de x
# D'après [url]http://python.jpvweb.com/mesrecettespython/doku.php?id=math_decimal[/url]
    if type(x)!=type(Decimal):
        x = D(str(x))
    return x.sqrt()

def MinMax():
    print ("            +++ Choix des périmètres mini et maxi +++\n")
    while 1:
        mini=input("Périmètre minimum souhaité ?  ")
        try:
            minp=int(mini)
            break
        except ValueError:
            print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")            
    while 1:
        maxi=input("Perimètre maximum souhaité ?  ")
        try:
            maxp=int(maxi)+1
            if maxp<=minp:
                print ("Erreur,le maximum doit être supérieur au mini. Veuillez recommencer S.V.P..\n\n")
            else:
                break
        except ValueError:
            print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")
    print("\n\n")
    return minp,maxp

def ChoixLimiteSuperieure():
    print ("\n            +++ Choix de la limite supérieure +++\n")
    while 1:
        nn=input("Limite supérieure souhaitée entre 1 et 15 ?  ")
        try:
            n=int(nn)
            if n>0 and n<16:
                break
            else:
                print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")          
        except ValueError:
            print ("Entrée incorrecte. Veuillez recommencer S.V.P..\n\n")
    return n

def Generation_des_Triangles(minp,maxp,Trg,Dico,chx):
    nb,s=0,0
    for p in range(minp,maxp): # p est le périmètre
        nb1=nb
        for AC in range(1,maxp): # AC sera limité bien avant maxp
            BC=(p-AC)//2 # division euclidienne
            if BC<AC:
                break # AC est trop grand, passer à la valeur suivante de AC
            AB=p-AC-BC
            while 1: # boucle pour tous les triangles tels que AC<=BC<=AB
                if AB>=AC+BC: # le triangle n'existe pas
                    break # donc sortie de la boucle while...            
                nb+=1
                s=p*(p-2*AB)*(p-2*AC)*(p-2*BC)
                Trg.append((p,AC,BC,AB,s))  # Stockage du quintuplet trouvé
                BC-=1 #triangle suivant de même périmètre
                AB+=1
                if BC<AC:
                    break
        Dico.update({p:[nb1,nb]})  # je complète mon dictionnaire
    return Trg,Dico

def Points_Intérieurs_triangles(Max,Trg):
    print("       +++ Points intérieurs à distances entières des sommets +++\n\n")
    nombre=0
    for p,AC,BC,AB,s in Trg:
        AC2,BC2,AB2 = AC**2,BC**2,AB**2        
        b,L=AB-1,[]
        R,r=sorted([AC2,BC2,AB2]),""
        if R[2]==R[1]+R[0]:
            r=" R"
        for AM in range(1, b):
            AM2,db = AM**2,AB-AM+1
            for BM in range(db,Max):
                BM2 = BM**2
                xc = (AC2 + AB2 - BC2)/(2 * AB)
                yc = sqrt(AC2 - xc**2)
                xm = (AM2 + AB2 - BM2)/(2 * AB)
                ym = sqrt(AM2 - xm**2)            
                if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
                    #M est intérieur                          
                    CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
                    CM=round(CMd)   #CM=int(CMd + 0.0000001)
                    if abs(CM - CMd) < 0.0001:
                        #recalcul sur entiers
                        xcL = AC2 + AB2 - BC2
                        xmL = AM2 + AB2 - BM2
                        Yc2 = 4 * AB2 * AC2 - (xcL**2)  #4*AB*AB*yc*yc
                        Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
                        g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
                        if g**2 == Yc2 * Ym2:
                            if [AM,BM,CM] not in L:                                
                                nombre += 1
                                print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM,r)                                
                                L+=[[AM,BM,CM],[AM,CM,BM],[BM,AM,CM],[BM,CM,AM],[CM,AM,BM],[CM,BM,AM]]
                                if nombre == 1300:            
                                    return                
                else:
                    break

def Points_Intérieurs_TrianglesScalènes(Max,Trg):
    print("   +++ Triangles scalènes : points intérieurs à distances entières des sommets +++\n\n")
    nombre=0
    for p,AC,BC,AB,s in Trg:
        if not (AB==AC or AC==BC or AB==BC):
            AC2,BC2,AB2 = AC**2,BC**2,AB**2
            b=AB-1
            for AM in range(1, b):
                AM2,db = AM**2,AB-AM+1
                for BM in range(db,Max):
                    BM2 = BM**2
                    xc = (AC2 + AB2 - BC2)/(2 * AB)
                    yc = sqrt(AC2 - xc**2)
                    xm = (AM2 + AB2 - BM2)/(2 * AB)
                    ym = sqrt(AM2 - xm**2)            
                    if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
                        #M est intérieur                          
                        CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
                        CM=round(CMd)   #CM=int(CMd + 0.0000001)
                        if abs(CM - CMd) < 0.0001:
                            #recalcul sur entiers
                            xcL = AC2 + AB2 - BC2
                            xmL = AM2 + AB2 - BM2
                            Yc2 = 4 * AB2 * AC2 - (xcL**2)  #4*AB*AB*yc*yc
                            Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
                            g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
                            if g**2 == Yc2 * Ym2:
                                nombre += 1
                                print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
                                if nombre == 1300:            
                                    return
                    else:
                        break

def Points_Intérieurs_TrianglesIsocèles(Max,Trg):
    print("     +++ Points des triangles isocèles à distances entières des sommets +++\n\n")
    nombre=0
    for p,AC,BC,AB,s in Trg:
        if (AB==AC or AB==BC or AC==BC) and not (AB==BC==AC):
            AC2,BC2,AB2 = AC**2,BC**2,AB**2
            b=AB-1
            L=[]
            for AM in range(1, b):
                AM2,db = AM**2,AB-AM+1
                for BM in range(db,Max):
                    BM2 = BM**2
                    xc = (AC2 + AB2 - BC2)/(2 * AB)
                    yc = sqrt(AC2 - xc**2)
                    xm = (AM2 + AB2 - BM2)/(2 * AB)
                    ym = sqrt(AM2 - xm**2)            
                    if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
                        #M est intérieur                          
                        CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
                        CM=round(CMd)    #CM=int(CMd + 0.0000001)
                        if abs(CM - CMd) < 0.0001:
                            #recalcul sur entiers
                            xcL = AC2 + AB2 - BC2
                            xmL = AM2 + AB2 - BM2
                            Yc2 = 4 * AB2 * AC2 - (xcL**2)  #4*AB*AB*yc*yc
                            Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
                            g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
                            if g**2 == Yc2 * Ym2:
                                if [AM,BM,CM] not in L:                                
                                    nombre += 1
                                    print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)                                
                                    L+=[[AM,BM,CM],[AM,CM,BM],[BM,AM,CM],[BM,CM,AM],[CM,AM,BM],[CM,BM,AM]]
                                    if nombre == 300:            
                                        return
                    else:
                        break

def Points_Intérieurs_TrianglesEquilatéraux(Max,Trg):
    print("     +++ Points des triangles équilatéraux à distances entières des sommets +++\n\n")
    nombre=0
    for p,AC,BC,AB,s in Trg:
        if AB==AC==BC:
            AC2,BC2,AB2 = AC**2,BC**2,AB**2
            b=AB-1
            for AM in range(1, b):
                AM2 = AM**2
                for BM in range(AB - AM + 1,Max):
                    BM2 = BM**2
                    xc = (AC2 + AB2 - BC2)/(2 * AB)
                    yc = sqrt(AC2 - xc**2)
                    xm = (AM2 + AB2 - BM2)/(2 * AB)
                    ym = sqrt(AM2 - xm**2)            
                    if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
                        #M est intérieur                          
                        CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
                        CM=int(CMd + 0.0000001)
                        if abs(CM - CMd) < 0.000001:
                            #recalcul sur entiers
                            xcL = AC2 + AB2 - BC2
                            xmL = AM2 + AB2 - BM2
                            Yc2 = 4 * AB2 * AC2 - (xcL**2)  #4*AB*AB*yc*yc
                            Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
                            g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
                            if g**2 == Yc2 * Ym2:
                                nombre += 1
                                print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
                                if nombre == 300:                                    
                                    return
                    else:
                        break

def Points_Intérieurs_2DistancesEgales(Max,Trg):
    print("     +++ Points à distances entières des sommets dont DEUX égales +++\n\n")
    nombre=0
    for p,AC,BC,AB,s in Trg:
        AC2,BC2,AB2 = AC**2,BC**2,AB**2
        b=AB-1
        for AM in range(1, b):
            AM2,db = AM**2,AB-AM+1
            for BM in range(db,Max):
                BM2 = BM**2
                xc = (AC2 + AB2 - BC2)/(2 * AB)
                yc = sqrt(AC2 - xc**2)
                xm = (AM2 + AB2 - BM2)/(2 * AB)
                ym = sqrt(AM2 - xm**2)            
                if ym * xc - (xm * yc) + 0.001 < 0 and ym * (xc - AB) - (yc * (xm - AB)) - 0.001 > 0:
                    #M est intérieur                          
                    CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
                    CM=round(CMd)   #CM=int(CMd + 0.0000001)
                    if abs(CM - CMd) < 0.000001:
                        #recalcul sur entiers
                        xcL = AC2 + AB2 - BC2
                        xmL = AM2 + AB2 - BM2
                        Yc2 = 4 * AB2 * AC2 - (xcL**2)  #4*AB*AB*yc*yc
                        Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
                        g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
                        if g**2 == Yc2 * Ym2:
                            if (AM==BM or AM==CM or BM==CM):
                                nombre += 1
                                print("N°","%4i" % nombre," : ","Périmètre :","%3i" % p," *", "%3i" % AC,"%3i" % BC,"%3i" % AB," --- ","%3i" % AM,"%3i" % BM, "%3i" % CM)
                else:
                    break

def Distances_Points_Intérieurs_trianglesDeuxPlusUn(Max,nombre,Trg):
    n=ChoixLimiteSuperieure()  
    print("\n\n       +++ Points à distances entières (moins une) des sommets +++\n\n")
    for p,AC,BC,AB,s in Trg:
        AC2,BC2,AB2 = AC**2,BC**2,AB**2
        b=AB-1
        L=[]
        for AM in range(1, b):
            AM2 = AM**2
            for BM in range(AB - AM + 1,Max):
                BM2 = BM**2
                xc = (AC2+AB2-BC2)/D(2*AB)
                yc = sqD(AC2 - xc**2)
                xm = (AM2 + AB2 - BM2)/D(2 * AB)
                ym = sqD(AM2 - xm**2)          
                if  ym * xc - (xm * yc) + D('0.001') <D('0') and  ym * (xc - AB) - (yc * (xm - AB)) - D('0.001') > D('0'):
                    #M est intérieur                
                    CMd = sqD((xm - xc)**2 + (ym - yc)**2)
                    CM=round(CMd)
                    if abs(CM - CMd) < D(10**(-n)):
                        xcL = AC2 + AB2 - BC2
                        xmL = AM2 + AB2 - BM2
                        Yc2 = 4 * AB2 * AC2 - (xcL**2)  #4*AB*AB*yc*yc
                        Ym2 = 4 * AB2 * AM2 - (xmL**2) #4*AB*AB*ym*ym
                        g = 2 * AB2 * (AC2 + AM2 - CM**2) - ((AB2 + AM2 - BM2) * (AC2 + AB2 - BC2))
                        if g**2 != Yc2 * Ym2:                              
                            nombre+=1
                            print("N°","%4i" % nombre,": ","Périmètre :","%3i" % p,"*", "%3i" % AC,"%3i" % BC,"%3i" % AB,"--- ","%3i" % AM,"%3i" % BM, CMd)
                            print ("       Ecart à l'entier le plus proche :", CMd-CM,"\n")                                
                else:
                    break
   
def AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx):
    if chx=="7":
        print("  +++ Tri à périmètre égal par aires croissantes +++\n\n")
    for p in range(minp,maxp):
        a,b=Dico[p]
        Ordre=[]
        if b-a>1:  # s'il y a plus d'un triangle de périmètre p
            Peri=Trg[a:b]  
            for i,(p,x,y,z,s)in enumerate(Peri):
                Ordre.append((i,s))
            Ordre=sorted(Ordre,key=itemgetter(1)) # tri sur 2e élément d'un tuple
            for i,(no,s) in enumerate(Ordre): # évite gestion compteur
                Trg[a+i]=Peri[no]  #remplacement par les tuples triés

    if chx =="7": # Affichage de la liste triée
        p1=minp
        for i,(p,x,y,z,s)in enumerate(Trg):
            if p!= p1:
                p1=p
                print("\n")  
            print ("Périmètre :","%3i" % p,"%3i" % x,"%3i" % y,"%3i" % z,"  Aire :",round(sqrt(s)/4,3))
    return Trg

def Tri_PerimetresEgaux_AiresEgales(minp,maxp,Trg,Dico):
    print("   +++ Triangles triés, à périmètres égal, par aires croissantes +++\n\n")
    for p in range(minp,maxp):
        a,b=Dico[p]
        Ordre=[]
        if b-a>1:  # s'il y a plus d'un triangle de périmètre p
            Peri=Trg[a:b]
            for i,(p,x,y,z,s)in enumerate(Peri):
                Ordre.append((i,s))
            Ordre=sorted(Ordre,key=itemgetter(1)) # tri sur 2e élément d'un tuple
            for i,(x,s) in enumerate(Ordre): # évite gestion compteur
                Trg[a+i]=Peri[x]  #remplacement par les tuples triés  
    n,cpt,h=len(Trg),0,0
    for i in range(n):
        j=i-1
        p0,x0,y0,z0,s0=Trg[j]
        p,x,y,z,s=Trg[i]
        if s==s0:
            h+=1
            if cpt==0: # évite de répéter le 1er triangle, si plus de deux
                print ("Aire :", round(sqrt(s)/4,3))
                print ("Périmètre :","%3i" % p0,"; côtés :","%3i" % x0,"%3i" % y0,"%3i" % z0)
            print ("Périmètre :","%3i" % p,"; côtés :","%3i" % x,"%3i" % y,"%3i" % z)
            cpt+=1
        else:
            if cpt>0:
                print()
                cpt=0
    if h==0:
        print ("\n\n         *** Pas de réponse ***\n\n")
    return

def Perimètres_et_aires_croissantes(minp,maxp,Trg,Dico):
    print("       +++ Triangles triés par aires égales (ordre croissant) +++\n\n")
    n,cpt=len(Trg),0
    Trg=sorted(Trg,key=itemgetter(4))
    for i in range(1,n):
        j=i-1
        p0,x0,y0,z0,s0=Trg[j]      
        p,x,y,z,s=Trg[i]
        if s==s0:
            if cpt==0:
                print ("Périmètre :","%3i" % p0,"%3i" % x0,"%3i" % y0,"%3i" % z0,"  Aire :",round(sqrt(s0)/4,3))
            print ("Périmètre :","%3i" % p,"%3i" % x,"%3i" % y,"%3i" % z,"  Aire :",round(sqrt(s)/4,3))
            cpt+=1
        else:
            if cpt>0:
                print()
                cpt=0
    return


# Menu
stoppe=0
while not stoppe:
    Trg,nb,nombre=[],0,0
    Dico={}
    print ("                 **************************")
    print ("                 *                        *")
    print ("                 * Tout sur les triangles *")
    print ("                 *                        *")
    print ("                 **************************")
    print ()
    print ()
    print ("             Voulez-vous lister les triangles :")
    print ()
    print ("     1. avec points intérieurs à distances entières")
    print ("     2. avec points intérieurs à distances entières (Triangles Scalènes)")    
    print ("     3. isocèles avec points intérieurs à distances entières")
    print ("     4. équilatéraux avec points intérieurs à distances entières")
    print ("     5. avec points intérieurs à distances entières dont 2 égales")
    print ("     6. avec points intérieurs à 2 distances entières et une 3e non")
    print ("     7. à périmètre égal, triés par aires croissantes")
    print ("     8. de même aire ET même périmètre")
    print ("     9. de mêmes aires")
    print ()
    print ("            0. Quitter le programme")
    print ()
    print ("                    **  Votre choix : ** ",end="")
    while 1:
        chx=input()
        if chx=="0":
            stoppe=1            
        elif chx in "1 2 3 4 5 6 7 8 9":
            print ("\n")
            minp,maxp=MinMax()
            Trg,Dico=Generation_des_Triangles(minp,maxp,Trg,Dico,chx)
            print()
            if chx =="1":
                Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
                Points_Intérieurs_triangles(maxp,Trg)              
            elif chx=="2":
                Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
                Points_Intérieurs_TrianglesScalènes(maxp,Trg)                                        
            elif chx=="3":
                Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
                Points_Intérieurs_TrianglesIsocèles(maxp,Trg)                
            elif chx=="4":
                Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
                Points_Intérieurs_TrianglesEquilatéraux(maxp,Trg)
            elif chx=="5":
                Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
                Points_Intérieurs_2DistancesEgales(maxp,Trg)                  
            elif chx=="6":
                Trg=AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)
                Distances_Points_Intérieurs_trianglesDeuxPlusUn(maxp,nombre,Trg)                              
            elif chx=="7":              
                AfficheAiresCroissantes_MemePerimetre(Dico,Trg,chx)                
            elif chx=="8":
                Tri_PerimetresEgaux_AiresEgales(minp,maxp,Trg,Dico)              
            else:
                Perimètres_et_aires_croissantes(minp,maxp,Trg,Dico)
            break
        else:
            print ("Réponses attendues : 0,1,2,3,4,5,6,7, 8 ou 9. Veuillez recommencer s'il vous plaît...")
            print ("\n")
            print ("\n")
        break
    print ("\n")
    print ("\n")

print ("                 A la prochaine !")

@+

Dernière modification par yoshi (22-07-2014 22:13:52)

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)?
soixante sept plus quarantesept
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