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

#201 29-07-2014 12:46:30

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

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

Re,

Erreur de programmation (trop de risques de valeurs approchées dans les quotients), j'ai refait le module orthocentre :

Triangles isocèles et orthocentre

Périmètre :    64  *    24   20   20  ---     7   15   15  *** MI  =    9 <> SI  =   16
Périmètre :   128  *    48   40   40  ---    14   30   30  *** MI  =   18 <> SI  =   32
Périmètre :   192  *    72   60   60  ---    21   45   45  *** MI  =   27 <> SI  =   48
Périmètre :   256  *    96   80   80  ---    28   60   60  *** MI  =   36 <> SI  =   64
Périmètre :   320  *   120  100  100  ---    35   75   75  *** MI  =   45 <> SI  =   80
Périmètre :   384  *   144  120  120  ---    42   90   90  *** MI  =   54 <> SI  =   96
Périmètre :   432  *   120  156  156  ---   119   65   65  *** MI  =   25 <> SI  =  144
Périmètre :   448  *   168  140  140  ---    49  105  105  *** MI  =   63 <> SI  =  112

Il y des orthocentres.
Valeurs supplémentaires affichées pour vérifications manuelles.
Résultats pour 10<=p<500.

Test manuel du 1er triangle.
S : nom générique du sommet du triangle isoicèle.
P et R noms génériques des extrémités de la base et I milieu de [PR]
On a donc (SI) qui est bissectrice, hauteur, médiatrice, médiane.
Tous mes points particuliers sont situés sur cette droite.
Origine des coordonnées : P.
Axe des abscisses : droite (PR), sens positif de P vers R...
Encore mal pensé pour bissectrices et médianes : le point d'intersection est toujours à l'intérieur du triangle, pas le centre du cercle circonscrit et l'orthocentre.
Donc pour les deux premiers, il faut supprimer la condition demi-angle au sommet <45°, donc nécessité de générer à part ces triangles.
Bon, revenons à l'orthocentre.
Vérification manuelle 1er triangle
b (base) = 24 ; a (côté) = 20
SI (hauteur du triangle) = 16. contrôle sqrt(20**2-12**2) =16
MI = 9  donc MS (une des distances cherchées) = 16-9 =7
Coordonnées vecteurs :
[tex]\vec{PM}(12\;;\;9)[/tex]
[tex]\vec{RS}(-12\;;\;16)[/tex]
Et 12*(-12)+9*16=0
Les droites (PM) et (RS) sont bien perpendiculaires, en foi de quoi le point M dans le triangle trouvé est bien l'orthocentre...

Je m'absente 45 min, puis je reviens vérifier cercle inscrit et centre de gravité.

Comme déjà dit : ça fonctionne rarement du 1er coup...

@+

Hors ligne

#202 29-07-2014 14:15:43

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,asin,pi

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 Genere_IsoC(minp,maxp):
    Trg=[]
    for p in range(minp,maxp):
        for b in range(1,maxp):
            a=p-b
            if a>b and a%2==0 and asin(b/a)<pi/4:
                Trg.append((p,b,a//2,a//2))
    return Trg

def Genere_IsoAutre(minp,maxp):
    Trg=[]
    for p in range(minp,maxp):
        for b in range(1,maxp):
            a=p-b
            if a>b and a%2==0:
                Trg.append((p,b,a//2,a//2))
    return Trg


def circonscrit(minp,maxp):
    Trg=Genere_IsoC(minp,maxp)
    candidats=[]
    print ("\n    ** Triangles isocèles ayant un rayon du cercle circonscrit entier **\n\n")
    for p,b,a,a1 in Trg:
        R=a**2/sqrt(4*a**2-b**2)
        if float(int(R))==R:
            h=sqrt(a**2-b**2/4)
            l=h-R
            d=sqrt((b//2)**2+l**2)
            if d==R:
                print ("Périmètre :","%5i" %p," * ","%4i" %b,"%4i" %a,"%4i" %a,"  rayon :","%4i" % int(R),"   OK !")
    return

def inscrit(minp,maxp):
    Trg=Genere_IsoAutre(minp,maxp)
    print ("\n    ** Triangles isocèles et centre du cercle inscrit **\n\n")
    for p,b,a,a1 in Trg:
        SI=sqrt(a**2-b**2/4)
        fin=int(SI)+1
        for MI in range(1,fin):
            MS = SI-MI  
            if 2*a*MI==b*MS:
                PM=sqrt(MI**2+b**2/4)
                if float(int(PM))==PM:
                    print ("Périmètre :","%5i" %p," * ","%4i" %b,"%4i" %a,"%4i" %a," --- ","%4i" %MS,"%4i" %int(PM),"%4i" %int(PM),"  Rayon :","%4i" %int(MI))
    return

def gravite(minp,maxp):
    Trg=Genere_IsoAutre(minp,maxp)
    print ("\n    ** Triangles isocèles et centre de gravité **\n")
    for p,b,a,a1 in Trg:
        SI=sqrt(a**2-b**2/4)
        if float(int(SI))==SI and SI%3==0:
            MI=SI//3  # M est le centre de gravité du triangle
            PM=sqrt(MI**2+b**2/4)
            if float(int(PM))==PM: #si la logueur PM est un entier, alors M convient
               print ("Périmètre :","%5i" %p," * ","%4i" %b,"%4i" %a,"%4i" %a," --- ",int(SI-MI),int(PM),int(PM))
    return  

def orthocentre(minp,maxp):
    Trg=Genere_IsoC(minp,maxp)
    # S,P,R,I : noms génériques du sommet principal et des 2 autres sommets, et du milieu de [PR]
    # Placement d'un repère orthonormé de centre P et tel que [PR] vest sur l'axe des abscisses
    print ("\n     ** Triangles isocèles et orthocentre **\n")
    for p,b,a,a1 in Trg:
        SI=sqrt(a**2-b**2/4)
        if float(int(SI))==SI:
            SI=int(SI)
            for MI in range(1,SI):
                x,y=b/2,MI           #coordonnées du vecteur PM
                x1,y1=-b/2,SI        #coordonnées du vecteur RS
                if x*x1+y*y1==0:     # condition d'orthogonalité de 2 vecteurs
                    SM,PM=SI-MI,sqrt(MI**2+b**2/4)          
                    print ("Périmètre :","%5i" %p," * ","%4i" %b,"%4i" %a,"%4i" %a," --- ","%4i" %SM,"%4i" %int(PM),"%4i" %int(PM)," *** MI  =","%4i" %MI,"<> SI  =","%4i" %SI)
    return


# Menu Pricipal
Dic_Fonc={"1":circonscrit,"2":inscrit,"3":gravite,"4":orthocentre} # Dictionnaire de noms de fonctions
stoppe=0
while not stoppe:
    Trg,Dico,nb,nombre=[],{},0,0
    print ("                 **************************")
    print ("                 *                        *")
    print ("                 *   Triangles Isocèles   *")
    print ("                 *   Points particuliers  *")
    print ("                 *        v. 1.0          *")
    print ("                 *                        *")
    print ("                 **************************")
    print ()
    print ()
    print ("             Voulez-vous lister les triangles :")
    print ()
    print ("     1. Où M est le centre du cercle circonscrit")
    print ("     2. Où M est le centre du cercle inscrit")    
    print ("     3. Où M est le centre de gravité")
    print ("     4. Où M est l'orthocentre")
    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" :
            print ("\n")
            minp,maxp=MinMax()
            Dic_Fonc[chx](minp,maxp)          
        else:
            print ("Réponses attendues : 0,1,2,3,4. Veuillez recommencer s'il vous plaît...")
            print ("\n")
            print ("\n")
        break
    print ("\n")
    print ("\n")
print("    A la prochaine !")
 

Je voudrais bien trouver une faute...
Donc, pas de Centre de Gravité, hélas...

Je vais continuer à chercher.
Au passage, point communs entre les items 1, 2 et 4 : on passe par des perpendiculaires...
C'est tout ce que je peux avancer comme constat (et non explication).

@+

Hors ligne

#203 29-07-2014 15:08:15

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 :

Je voudrais bien trouver une faute...

Je vais essayer d'examiner tout ça.

yoshi a écrit :

Donc, pas de Centre de Gravité, hélas...

S'il s'avère qu'il n'y en a pas, ce serait une information très intéressante!

Donc je ne dirais pas "hélas" pour ma part.  ;)

___


Il faudrait voir avec les scalènes...


@+

Hors ligne

#204 29-07-2014 15:55:48

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

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

Re,

Autre point particulier pour le Centre de Gravité : la hauteur du triangle isocèle étant calculée, je peux pas chercher la position sur cette hauteur, elle est fixée.
Cette position est à 2/3 de la longueur à partir du sommet...
Pour les 3 autres, je cherche une position sur cette hauteur : là je n'ai pas le choix.
Donc le prog calcule la hauteur (Pythagore)
Je n'ai étudié que les entiers multiples de 3 (pour que la distance de M au sommet principal soit entière).
Sur la hauteur, il place le point M à 1/3 à partir de I ...
Puis avec Pythagore, je calcule la distance du centre de gravité à l'une des extrémités de la base (Pythagore encore).
Si cette distance est entière, c'est gagné : dans tous mes essais, elle n'a jamais été entière....

Pour le cercle inscrit, je calcule la hauteur h =SI...
J'en prends la valeur entière +1  (les boucles ne fonctionnent qu'avec des entiers)
Puis de 1 à la partie entière de SI, je place M sur [SI] tel que MI=1,2,3,... SI.
A chaque fois, je teste si les produits en croix obtenus à partir des rapports pour définir une bissectrice, sont égaux.
Si ouin, alors [PM) est une bien une bissectrice et M le centre du cercle inscrit.
Reste encore à vérifier que la longueur PM est entière...
Si oui, bingo !

Pour l'orthocentre, j'ai donné beaucoup d'explications.
La clé est l'utilisation de formule donnée autrefois en 3e, maintenant en 1ere :
si (x,y) sont les coordonnée d'un 1er vecteur, (x',y') celle d'un 2nd vecteur, alors
xx'+yy' = 0 <==> les vecteurs 1 et 2 sont perpendiculaires.
Avec ça, la seule valeur approchée éventuelle est celle de la racine carrée.
J'élimine ce cas en ne prenant que des racines carrées exactes entières pour que la distance de M au sommet soit entière...
Et plus de division !

Là, j'ai fait des maths, pas de l'informatique qui n'a servi qu'à automatiser les calculs répétitifs...
@+

Donc niveau 3e exigé (avec une pointe en 1ere).

@+

Hors ligne

#205 29-07-2014 16:11:24

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

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

Re,

Les Maths de 3° suffisent à pas mal de choses.

Quels étaient les niveaux en math d'un Pythagore et d'un Archimède?

   ;)

@+

Hors ligne

#206 30-07-2014 14:04:16

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

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

Bonjour,

J'ai observé par hasard une propriété intéressante ou triviale je ne sais pas encore, qui est la suivante:


Soit ABC un triangle rectangle en A dont les cotés sont entiers et ABM un triangle quelconque dont cependant les cotés sont également entiers.

Que M soit intérieur ou non et surtout que CM soit entier, rationnel ou pas: ACM aura une aire rationnelle voire entière.

Ce n'est pas tout: la somme ou la différence des aires de ABM et de BCM sera également rationnelle voire entière.

Exemples:

AB=3         BC=5          AC=4          AM=4          BM=2             Aire de ACM = 7                Aire de BCM - Aire de ABM = 1

AB=7         BC=25       AC=24        AM=20         BM=18         Aire de ACM = 750/7           Aire de BCM - Aire de ABM = 162/7

AB=5         BC=13       AC=12        AM=12         BM=14         Aire de ACM = 81/5             Aire de BCM + Aire de ABM = 231/5

AB=5         BC=13       AC=12        AM=11         BM=14           Aire de ACM = 30              Aire de BCM + Aire de ABM = 60


Note: Si M n'est pas intérieur on a ABMC, ABCM ou AMBC des quadrilatères particuliers car possédant au moins 3 cotés sur 4 qui sont entiers, des diagonales également entières et un angle droit au niveau d'un de leur sommet ou formé par un coté et une diagonale. On peut aussi avoir des triangles: ABM avec C intérieur ou BCM avec A intérieur. Dans ces cas: ABC sera un triangle interne (avec l'angle droit en A)...

@+

Hors ligne

#207 30-07-2014 14:46:53

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

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

Salut,

Je te vois passer de temps en temps, sans rien dire...
T'as donc rien à dire ? A part ton post #207 : j'ai fait un dessin, ça me rappelle vaguement quelque chose... Je chercherai quand j'aurai fini ce sur quoi je bosse.
T'attends du nouveau ?

Bon, bin, j'ai (un peu) de nouveau : j'ai passé deux bonnes heures à mettre au point (je pense que c'est au point) un générateur de triangles scalènes, différent de celui de totomm, je le pense plus court, plus rapide et sans doublon.
Et j'en ai une 2e version qui ne prend pas en compte tout triangle ayant un angle obtus).
La 1ere version va servir pour les tests de cercles inscrits et centre de gravité et la 2e pour les tests de cercles inscrits et orthocentres.
Mais les calculs risquent d'être "cotons" à finaliser...
Bonjour les nombres en virgule flottante !

@+

Hors ligne

#208 30-07-2014 14:56:13

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

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

Salut,

Je passe oui, ou plutôt je traîne... J'ai mon ordi connecté en permanence mais je ne suis pas dessus non-stop...

Je surveille en effet s'il y a du nouveaux et je teste des trucs...


Je vois que tu bosses pas mal sur le sujet et je m'en réjouis! Ta deuxième version c'est donc pour les tests de cercles circonscrits et d'orthocentres, car les points qui leur correspondent ne sont pas forcément internes si je comprends bien?


Ce que j'ai mis en post #207 m'a paru suffisamment intéressant pour que je le présente.


@+

Hors ligne

#209 30-07-2014 15:44:27

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

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

Re,

Tu as parlé des mêmes tests que ceux faits sur les triangles isocèles (là, c'est finalisé depuis hier : rien à retoucher) mais sur les triangles exclusivement scalènes.
Si l'un de ces triangles possède un angle obtus, le centre du cercle circonscrit et l'orthocentre sont extérieurs au triangle, je dois donc éliminer tous les triangles qui ont un angle obtus.
Le centre du cercle inscrit et le Centre de gravité, eux, angle obtus ou pas, sont toujours intérieurs au triangle...
Je ne peux donc pas utiliser le même générateur : je risquerai d'être (dans le 2e cas) trop restrictif et passer à côté de réponses.
Soit un triangle ABC scalène tel que A est l'origine des corordonnées (BC) est porté par l'axe des abscisses et le sens positif de B vers C...
Avec AB=c, BC=a, AC=b.

J'ai besoin des coordonnées de A dans tous les cas...
Le plus "simple" :
A est à l'intersection des cercles
* de centre B et de rayon c d'équation x²+y² = c² (là, c'est Terminale...)
* de centre C et de rayon b d'équation (x-a)²+y² = b²
Je développe et soustrais membre à membre :
[tex]2ax-a^2= c^2-b^2 \Leftrightarrow x =\frac{a^2+c^2-b^2}{2a}[/tex]
C'est l'abscisse de A.
Après pour y, ll y a 2 valeurs une positive, une négative : je ne m'occuperai que de la 1ere :
[tex]y=\sqrt{c^2-\left(\frac{a^2+c^2-b^2}{2a}\right)^2}[/tex]

Drôle, hein ?

Ptêt qu'avec la trigo, c'est vraiment plus simple... A voir !

@+

Hors ligne

#210 30-07-2014 15:56:08

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

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

Re,

Oui, on retombe sur ses pieds! :)


@+


[EDIT]: Cette formule est entièrement déductible à partir du théorème de Pythagore.

Dernière modification par 0^0 (30-07-2014 16:59:22)

Hors ligne

#211 30-07-2014 16:39:41

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

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

Re,

Si l'on utilisait:

    [tex]R=\frac{AB.BC.AC}{4 . A_{ABC}}[/tex]

Est-ce que cela permettrait d'aller plus vite?


@+

Hors ligne

#212 30-07-2014 18:10:21

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

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

Ave,

Je viens de rentrer : je n'y avais pas pensé !
Pour le cercle circonscrit oui :
il suffit de calculer ce rayon et de vérifier qu'il est entier.
Sachant que le triangle utilisé n'a pas d'angle obtus, ce centre est forcément à l'intérieur du triangle et ce point répond à la problématique....
Je mets en place et je te dis si je trouve des réponses jusqu'à p=1000...

@+

[EDIT]
301<=p<=801

Périmètre :   324  *    78  126  120   rayon :   65
Périmètre :   336  *   104  120  112   rayon :   65
Périmètre :   336  *   112  120  104   rayon :   65
Périmètre :   420  *   102  168  150   rayon :   85
Périmètre :   440  *   136  154  150   rayon :   85
Périmètre :   624  *   150  240  234   rayon :  125
Périmètre :   648  *   156  252  240   rayon :  130
Périmètre :   672  *   208  240  224   rayon :  130
Périmètre :   672  *   224  240  208   rayon :  130
Périmètre :   720  *   200  288  232   rayon :  145
Périmètre :   720  *   232  288  200   rayon :  145
Périmètre :   728  *   210  286  232   rayon :  145
Périmètre :   728  *   232  286  210   rayon :  145

Imperfection : je croyais avoir éliminé les doublons à la source..
Ce n'est donc encore pas ça !

A revoir

Dernière modification par yoshi (30-07-2014 18:38:56)

Hors ligne

#213 30-07-2014 19:02:04

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

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

Re,

Ton programme te sort ces résultats à quelle vitesse?

____


Pour AG la distance de A à G le centre de gravité de ABC il y a:


[tex]AG=\frac{1}{3}\sqrt{ 2.(AB^2+AC^2)-BC^2}[/tex]


@+

Hors ligne

#214 30-07-2014 19:09:09

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

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

Re,

il faut que je regarde la génération des triangles scalènes : il faut 5 min pour une tranche de 100.
D'autre part 539802 triangles scalènes sans angle obtus entre 801<=p<901, ça me paraît beaucoup... et cela pourrait expliquer le délai...

En v'la encore 5 (tests par tranches de 50) :

Périmètre :   840  *   204  336  300   rayon :  170
Périmètre :   880  *   272  308  300   rayon :  170
Périmètre :   924  *   222  352  350   rayon :  185
Périmètre :   952  *   296  350  306   rayon :  185
Périmètre :   952  *   306  350  296   rayon :  185
Périmètre :   972  *   234  378  360   rayon :  195

@+

[EDIT]
Problème doublons corrigé...
J'ai quand même 716 triangles scalènes sans angle obtus pour le seul périmètre 336, mais plus que 79069 triangles de périmètre 300 à 400 inclus (nettement plus raisonnable !)...

Dernière modification par yoshi (30-07-2014 20:57:40)

Hors ligne

#215 30-07-2014 21:05:39

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

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

Re,

Oui, plus le périmètre considéré est grand, plus les triangles sont nombreux, forcément...

Par conséquent, des lois générales seraient les bien venues... Des lois par exemple permettant de produire uniquement l'ensemble des triangles dont M est également l'orthocentre ou un autre point particulier...

Je ne sais pas si de telles lois générales existent.


[EDIT]: Donc en attendant... Il n'y a pas le choix...  :)


@+

Dernière modification par 0^0 (30-07-2014 22:25:00)

Hors ligne

#216 31-07-2014 15:49:57

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

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

Salut,

2 min de calcul avant affichage pour générer 490.000 triangles entre 401 et 601 avec comme côté minimum (min+maxp)/2, te paraît-il acceptable ?

@+

Hors ligne

#217 31-07-2014 16:03:11

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

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

Bonjour,

Tout à fait acceptable oui!  ;)

Je suis curieux de voir à quoi ressemble l'animal!

@+

Hors ligne

#218 31-07-2014 21:01:16

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

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

Bonsoir,

Je reviens avec ça:


Si G est le centre de gravité de ABC:


[tex]AG=\frac{1}{3}\sqrt{ 2.(AB^2+AC^2)-BC^2}[/tex]

[tex]BG=\frac{1}{3}\sqrt{ 2.(AB^2+BC^2)-AC^2}[/tex]

[tex]CG=\frac{1}{3}\sqrt{ 2.(BC^2+AC^2)-AB^2}[/tex]


T'es-tu basé sur cela pour ton test de M confondu avec G?


@+

Hors ligne

#219 31-07-2014 21:03:02

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

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

Bonsoir,

Dans ce cas, voilà le code précédent enrichi.
Le menu est bien simple maintenant à gérer via un dictionnaire de fonctions.
Quelques explications (là, les exemples, sont faits avec un côté a commençant à 2)
périmètre   côtés des triangles
p              a  c  b
19            2  7  9  ne doit pas arriver (2 et 6 ne donnaient pas de triangle)
19            2  8  9  on commence à 8  soit p//2+1-a. sera rejeté comme ayant un angle obtus
19           2  9  8  on s'arrête avant puisque dès lors, c'est du déjà vu. Indice de fin de boucle c : (p-a)//2 +1 si (p-a est impair)

19            3  7  9   rejeté comme obtus
19            3  8  8   n'apparaît pas : puisque l' indice fin de boucle c est : (19-3)//2 = 8 et que la boucle s'arrête donc avant

19            4  6  9   rejeté comme obtus
19            4  7  8   bon
19            4  8  7   n'apparaît pas : puisque l' indice fin de boucle c est : (19-4)//2 +1 = 8 et que la boucle s'arrête donc avant

19            5  5  9   éliminé par le cas : if c!=a:
19            5  6  8   rejeté comme obtus
19            5  7  7  n'apparaît pas : puisque l' indice fin de boucle c est : (19-5)//2  = 7 et que la boucle s'arrête donc avant

19            6  4  9  déjà vu  avec 4 6 9 sera éliminé puisque présent dans Peri
19            6  5  8  déjà vu  avec 5 6 8 sera éliminé puisque présent dans Peri + 1 obtus
19            6  6  7  éliminé par le cas : if c!=a:

19            7  3  9  à partir de maintenant tous les cas suivants sont déjà vus. Donc fin de boucle a fixée à 1+(p+1)//3, ici 7...



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

from math import sqrt,asin,pi
from time import clock

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 Genere_IsoC(minp,maxp):
    Trg=[]
    for p in range(minp,maxp):
        for b in range(1,maxp):
            a=p-b
            if a>b and a%2==0 and asin(b/a)<pi/4:
                Trg.append((p,b,a//2,a//2))
    return Trg

def Genere_IsoAutre(minp,maxp):
    Trg=[]
    for p in range(minp,maxp):
        for b in range(1,maxp):
            a=p-b
            if a>b and a%2==0:
                Trg.append((p,b,a//2,a//2))
    return Trg

def circonscrit(minp,maxp):
    Trg=Genere_IsoC(minp,maxp)
    candidats=[]
    print ("\n    ** Triangles isocèles ayant un rayon du cercle circonscrit entier **\n\n")
    for p,b,a,a1 in Trg:
        R=a**2/sqrt(4*a**2-b**2)
        if float(int(R))==R:
            h=sqrt(a**2-b**2/4)
            l=h-R
            d=sqrt((b//2)**2+l**2)
            if d==R:
                print ("Périmètre :","%5i" %p," * ","%4i" %b,"%4i" %a,"%4i" %a,"  rayon :","%4i" % int(R))
    return

def inscrit(minp,maxp):
    Trg=Genere_IsoAutre(minp,maxp)
    print ("\n    ** Triangles isocèles et centre du cercle inscrit **\n\n")
    for p,b,a,a1 in Trg:
        SI=sqrt(a**2-b**2/4)
        fin=int(SI)+1
        for MI in range(1,fin):
            MS = SI-MI  
            if 2*a*MI==b*MS:
                PM=sqrt(MI**2+b**2/4)
                if float(int(PM))==PM:
                    print ("Périmètre :","%5i" %p," * ","%4i" %b,"%4i" %a,"%4i" %a," --- ","%4i" %MS,"%4i" %int(PM),"%4i" %int(PM),"  Rayon :","%4i" %int(MI))
    return

def gravite(minp,maxp):
    Trg=Genere_IsoAutre(minp,maxp)
    print ("\n    ** Triangles isocèles et centre de gravité **\n")
    for p,b,a,a1 in Trg:
        SI=sqrt(a**2-b**2/4)
        if float(int(SI))==SI and SI%3==0:
            MI=SI//3  # M est le centre de gravité du triangle
            PM=sqrt(MI**2+b**2/4)
            if float(int(PM))==PM: #si la logueur PM est un entier, alors M convient
                print ("Périmètre :","%5i" %p," * ","%4i" %b,"%4i" %a,"%4i" %a," --- ",int(SI-MI),int(PM),int(PM))
    return  

def orthocentre(minp,maxp):
    Trg=Genere_IsoC(minp,maxp)
    # S,P,R,I : noms génériques du sommet principal et des 2 autres sommets, et du milieu de [PR]
    # Placement d'un repère orthonormé de centre P et tel que [PR] vest sur l'axe des abscisses
    print ("\n     ** Triangles isocèles et orthocentre **\n")
    for p,b,a,a1 in Trg:
        SI=sqrt(a**2-b**2/4)
        if float(int(SI))==SI:
            SI=int(SI)
            for MI in range(1,SI):
                x,y=b/2,MI           #coordonnées du vecteur PM
                x1,y1=-b/2,SI        #coordonnées du vecteur RS
                if x*x1+y*y1==0:     # condition d'orthogonalité de 2 vecteurs
                    SM,PM=SI-MI,sqrt(MI**2+b**2/4)          
                    print ("Périmètre :","%5i" %p," * ","%4i" %b,"%4i" %a,"%4i" %a," --- ","%4i" %SM,"%4i" %int(PM),"%4i" %int(PM)," *** MI  =","%4i" %MI,"<> SI  =","%4i" %SI)
    return

def ScalenesAigus(minp,maxp):
    Trg=[]
    for p in range(minp,maxp):
        fina,Peri=1+(p+1)//3,[]
        da=(minp+maxp)//10
        for a in range(da,fina):
            reste,a2=p-a,a**2
            r1,rp1=reste%2,reste+1
            rp1=reste+1
            dc,finc=p//2+1-a,reste//2+r1
            for c in range(dc,finc):              
                if c!=a:                  
                    b,c2=reste-c,c**2
                    C=sorted([a,b,c])                  
                    if C not in Peri and a!=b:
                        b2=b**2
                        if (a2+b2-c2>0 and a2+c2-b2>0)                            :
                            Peri.append(C)
                            b2=b**2
                            Trg.append((p,a,c,b))    
    return Trg

def circonscrit_scalène(minp,maxp):
    tp_d=clock()
    Trg=ScalenesAigus(minp,maxp)
    dur=round(clock()-tp_d,1)
    print ("\n       +++ Temps de calcul avant affichage :",int(dur)//60,"min",dur%60,"s +++\n")
    print ("\n    ** Triangles Scalènes ayant un rayon du cercle circonscrit entier **\n")
    for p,a,b,c in Trg:
        s4=sqrt(p*(p-2*a)*(p-2*b)*(p-2*c))
        R = (a*b*c)/s4
        if float(int(R))==R:
            print ("Périmètre :","%5i" %p," * ","%4i" %a,"%4i" %b,"%4i" %c,"  rayon :","%4i" % int(R))    
    return

# Menu Pricipal
Dic_Fonc={"1":circonscrit,"2":inscrit,"3":gravite,"4":orthocentre,"5":circonscrit_scalène} # Dictionnaire de noms de fonctions
stoppe=0
while not stoppe:
    Trg,Dico,nb,nombre=[],{},0,0
    print ("                 **************************")
    print ("                 *                        *")
    print ("                 *       Triangles        *")
    print ("                 *   Points particuliers  *")
    print ("                 *        v. 1.0          *")
    print ("                 *                        *")
    print ("                 **************************")
    print ()
    print ()
    print ("             Voulez-vous lister les triangles :")
    print ()
    print ("     1. Isocèles où M est le centre du cercle circonscrit")
    print ("     2. Isocèles où M est le centre du cercle inscrit")    
    print ("     3. Isocèles où M est le centre de gravité")
    print ("     4. Isocèles où M est l'orthocentre")
    print ("     5. Scalènes où M est le centre du cercle circonscrit")  
    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" :
            print ("\n")
            minp,maxp=MinMax()
            Dic_Fonc[chx](minp,maxp)          
        else:
            print ("Réponses attendues : 0,1,2,3,4,5. Veuillez recommencer s'il vous plaît...")
            print ("\n")
            print ("\n")
        break
    print ("\n")
    print ("\n")
print("    A la prochaine !")

a=BC, b=AC, C = AB.
Avec mon système les seuls angles obtus possibles sont  en B ou C
J'extrais leur cosinus à partir du théorème d'Al Kashi et j'économise les divisions par 2ac ou 2ab qui sont positifs : je teste juste si :
(a2+b2-c2>0 and a2+c2-b2>0) ; dans le cas contraire les résultats sont  <=0 ce qui signifie que le cos sera <=0 et donc l'angle >= 90°.

Sil manquait des explications (probable) je te les donnerais demain (demande si besoin !).

@+

Hors ligne

#220 31-07-2014 21:29:57

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

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

Re,

Messages croisés...

Intéressant!

Je réexamine cela demain.

@+

Hors ligne

#221 31-07-2014 22:12:06

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

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

RE,

T'es-tu basé sur cela pour ton test de M confondu avec G?

Non,j j'étais parti du principe suivant 'pou les tr isocèle) et pour les 4 points particuliers :
Recherche de la position du point particulier (avec le tr isocèle, c'était simple, ce point était sur la médiatrice de la base) ; le point étant localisé recherche si les distances du point à chacun des sommets étaient entieres.

Là, pour les triangles scalènes, je vais générer des triangles même avec angle obtus, puis les passer en revue un par un et procéder ainsi :
calcul de AG
si AG entier:
   calcul BG
   si BG entier:
       calcul CG
       si CG entier;
           Affichage résultats

Et ce avec les formules que tu as apportées.Tu avais déjà donné AG, j'avais adapté pour BG et CG.
Resteront centre du cercle inscrit et orthocentre, mais à chaque jour suffit sa peine...

Concernant ma génération de triangles scalènes, je ne suis plus très sûr d'être plus rapide que totomm : je vérifierai en incluant (ce qui va être nouveau pour toi et que je viens d'introduire dans le code posté précédent) la mesure du temps écoulé...
Je serais fortement déçu si ce n'était pas le cas, vu le nombre d'heures passées dessus...

Il me reste à justifier les indices de fin de boucle fina et finc...
Pour fina, c'est empirique...
Pour finc, c doit rester  < b sinon, c'est du déjà vu..
donc c < b c'est à dire c < p-a-c soit 2c < p-a  et c < (p-a)/2 (ça ce sont des Maths).
Comme en Python, dans les boucles, on travaille avec des entiers, je suis obligé d'utiliser (p-a)//2.
Si p-a est pair,  en n'atteignant pas (p-a)//2, j'élimine le cas b=c (triangle isocèle et donc non scalène)
Si p-a est impair, le cas précédent n'existe pas et je peux atteindre la valeur (p-a)//2 : dans ce cas finc = (p-a)//2+1

Autre chose ?

@+

Hors ligne

#222 01-08-2014 08:43:27

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

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

Bonjour,

La cata intégrale !
Le module de totomm génère beaucoup beaucoup plus de triangles que le mien et se révèle malgré tout 60 fois plus rapide !!!

En outre, je ne suis plus très sûr maintenant de mon branchement dans son module (et ce depuis la page ou 3 de cette discussion..)
Je vais tout revoir...
Mon module est sûr, mais il est pire qu'un escargot...

@+

Hors ligne

#223 01-08-2014 10:04:29

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

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

Re,

Le module de totomm est fiable aussi mais son fonctionnement reste étrange...
M'enfin bon...
Alors pour un gain de temps appréciable, tu vas remplacer la fonction def ScalenesAigus(minp,maxp) d'hier par celle-ci :

def ScalenesAigus(minp,maxp):
    Trg=[]
    # Triangles à cotés entiers classés par pérmètres croissants  
    for p in range(minp,maxp): # p est le périmètre
        for b in range(1,maxp): # b sera limité bien avant maxp
            a=(p-b)//2 # division euclidienne
            if a<b:
                break # b est trop grand, passer à la valeur suivante de b
            c=p-b-a
            while 1: # boucle pour tous les triangles tels que b<=a<=c
                if c>=b+a: # le triangle n'existe pas
                    break # donc sortie de la boucle while...
                if not (a==b or a==c or b==c):
                    a2,b2,c2=a**2,b**2,c**2
                    if  a2+b2-c2>0 and a2+c2-b2>0 and b2+c2-a2>0:
                        Trg.append((p,a,c,b))
                a-=1 #triangle suivant de même périmètre
                c+=1
                if a<b:
                    break    
    return Trg

@+

Hors ligne

#224 01-08-2014 10:41:12

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

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

Bonjour,

La suite fut rapide (il y a bien des centres de gravité à distances entières) :


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

from math import sqrt,asin,pi
from time import clock

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 Genere_IsoC(minp,maxp):
    Trg=[]
    for p in range(minp,maxp):
        for b in range(1,maxp):
            a=p-b
            if a>b and a%2==0 and asin(b/a)<pi/4:
                Trg.append((p,b,a//2,a//2))
    return Trg

def Genere_IsoAutre(minp,maxp):
    Trg=[]
    for p in range(minp,maxp):
        for b in range(1,maxp):
            a=p-b
            if a>b and a%2==0:
                Trg.append((p,b,a//2,a//2))
    return Trg

def circonscrit(minp,maxp):
    Trg=Genere_IsoC(minp,maxp)
    candidats=[]
    print ("\n    ** Triangles isocèles ayant un rayon du cercle circonscrit entier **\n\n")
    for p,b,a,a1 in Trg:
        R=a**2/sqrt(4*a**2-b**2)
        if float(int(R))==R:
            h=sqrt(a**2-b**2/4)
            l=h-R
            d=sqrt((b//2)**2+l**2)
            if d==R:
                print ("Périmètre :","%5i" %p," * ","%4i" %b,"%4i" %a,"%4i" %a,"  rayon :","%4i" % int(R))
    return

def inscrit(minp,maxp):
    Trg=Genere_IsoAutre(minp,maxp)
    print ("\n    ** Triangles isocèles et centre du cercle inscrit **\n\n")
    for p,b,a,a1 in Trg:
        SI=sqrt(a**2-b**2/4)
        fin=int(SI)+1
        for MI in range(1,fin):
            MS = SI-MI  
            if 2*a*MI==b*MS:
                PM=sqrt(MI**2+b**2/4)
                if float(int(PM))==PM:
                    print ("Périmètre :","%5i" %p," * ","%4i" %b,"%4i" %a,"%4i" %a," --- ","%4i" %MS,"%4i" %int(PM),"%4i" %int(PM),"  Rayon :","%4i" %int(MI))
    return

def gravite(minp,maxp):
    Trg=Genere_IsoAutre(minp,maxp)
    print ("\n    ** Triangles isocèles et centre de gravité **\n")
    for p,b,a,a1 in Trg:
        SI=sqrt(a**2-b**2/4)
        if float(int(SI))==SI and SI%3==0:
            MI=SI//3  # M est le centre de gravité du triangle
            PM=sqrt(MI**2+b**2/4)
            if float(int(PM))==PM: #si la logueur PM est un entier, alors M convient
                print ("Périmètre :","%5i" %p," * ","%4i" %b,"%4i" %a,"%4i" %a," --- ",int(SI-MI),int(PM),int(PM))
    return  

def orthocentre(minp,maxp):
    Trg=Genere_IsoC(minp,maxp)
    # S,P,R,I : noms génériques du sommet principal et des 2 autres sommets, et du milieu de [PR]
    # Placement d'un repère orthonormé de centre P et tel que [PR] vest sur l'axe des abscisses
    print ("\n     ** Triangles isocèles et orthocentre **\n")
    for p,b,a,a1 in Trg:
        SI=sqrt(a**2-b**2/4)
        if float(int(SI))==SI:
            SI=int(SI)
            for MI in range(1,SI):
                x,y=b/2,MI           #coordonnées du vecteur PM
                x1,y1=-b/2,SI        #coordonnées du vecteur RS
                if x*x1+y*y1==0:     # condition d'orthogonalité de 2 vecteurs
                    SM,PM=SI-MI,sqrt(MI**2+b**2/4)          
                    print ("Périmètre :","%5i" %p," * ","%4i" %b,"%4i" %a,"%4i" %a," --- ","%4i" %SM,"%4i" %int(PM),"%4i" %int(PM)," *** MI  =","%4i" %MI,"<> SI  =","%4i" %SI)
    return

def ScalenesSimples(minp,maxp):
    Trg=[]
    # Triangles à cotés entiers classés par pérmètres croissants  
    for p in range(minp,maxp): # p est le périmètre
        for b in range(1,maxp): # b sera limité bien avant maxp
            a=(p-b)//2 # division euclidienne
            if a<b:
                break # b est trop grand, passer à la valeur suivante de b
            c=p-b-a
            while 1: # boucle pour tous les triangles tels que b<=a<=c
                if c>=b+a: # le triangle n'existe pas
                    break # donc sortie de la boucle while...
                if not (a==b or a==c or b==c):
                    Trg.append((p,a,c,b))
                a-=1 #triangle suivant de même périmètre
                c+=1
                if a<b:
                    break    
    return Trg

def ScalenesAigus(minp,maxp):
    Trg=[]
    # Triangles à cotés entiers classés par pérmètres croissants  
    for p in range(minp,maxp): # p est le périmètre
        for b in range(1,maxp): # b sera limité bien avant maxp
            a=(p-b)//2 # division euclidienne
            if a<b:
                break # b est trop grand, passer à la valeur suivante de b
            c=p-b-a
            while 1: # boucle pour tous les triangles tels que b<=a<=c
                if c>=b+a: # le triangle n'existe pas
                    break # donc sortie de la boucle while...
                if not (a==b or a==c or b==c):
                    a2,b2,c2=a**2,b**2,c**2
                    if  a2+b2-c2>0 and a2+c2-b2>0 and b2+c2-a2>0:
                        Trg.append((p,a,c,b))
                a-=1 #triangle suivant de même périmètre
                c+=1
                if a<b:
                    break    
    return Trg

def circonscrit_scalène(minp,maxp):
    tp_d=clock()
    Trg=ScalenesAigus(minp,maxp)
    dur=round(clock()-tp_d,1)
    print ("\n    ** Triangles Scalènes ayant un rayon du cercle circonscrit entier **\n")
    for p,a,c,b in Trg:
        s4=sqrt(p*(p-2*a)*(p-2*b)*(p-2*c))
        R = (a*b*c)/s4
        if float(int(R))==R:
            print ("Périmètre :","%5i" %p," * ","%4i" %a,"%4i" %b,"%4i" %c,"  rayon :","%4i" % int(R))    
    print ("\n       +++ Temps de calcul avant affichage :",int(dur)//60,"min",dur%60,"s +++\n")
    return

def gravite_scalene(minp, maxp):
    tp_d=clock()
    Trg=ScalenesSimples(minp,maxp)
    dur=round(clock()-tp_d,1)
    print ("\n** Triangles Scalènes ayant un Centre de gravité à distances entières des sommets **\n")
    for p,a,c,b in Trg:
        a2,b2,c2=a**2,b**2,c**2
        AM=sqrt((2*(c2+b2)-a2))/3        
        if float(int(AM))==AM:            
            BM=sqrt((2*(c2+a2)-b2))/3
            if float(int(BM))==BM:            
                CM=sqrt((2*(b2+a2)-c2))/3
                if float(int(BM))==BM:          
                    print("Périmètre :","%5i" % p," *", "%4i" % a,"%4i" % c,"%4i" % b," --- ","%4i" % int(AM),"%4i" % int(BM), "%4i" % int(CM))
    print ("\n          +++ Temps de calcul avant affichage :",int(dur)//60,"min",dur%60,"s +++\n")
    return  

# Menu Pricipal
# Dictionnaire de noms de fonctions                          
Dic_Fonc={"1":circonscrit,"2":inscrit,"3":gravite,"4":orthocentre,"5":circonscrit_scalène,"6":gravite_scalene}
                           
##########
stoppe=0
while not stoppe:
    Trg,Dico,nb,nombre=[],{},0,0
    print ("                 **************************")
    print ("                 *                        *")
    print ("                 *       Triangles        *")
    print ("                 *   Points particuliers  *")
    print ("                 *        v. 2.21         *")
    print ("                 *                        *")
    print ("                 **************************")
    print ()
    print ()
    print ("             Voulez-vous lister les triangles :")
    print ()
    print ("     1. Isocèles où M est le centre du cercle circonscrit")
    print ("     2. Isocèles où M est le centre du cercle inscrit")    
    print ("     3. Isocèles où M est le centre de gravité")
    print ("     4. Isocèles où M est l'orthocentre")
    print ("     5. Scalènes où M est le centre du cercle circonscrit")
    print ("     6. Scalènes où M est le centre de gravité")    
    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" :
            print ("\n")
            minp,maxp=MinMax()
            Dic_Fonc[chx](minp,maxp)          
        else:
            print ("Réponses attendues : 0,1,2,3,4,5,6. Veuillez recommencer s'il vous plaît...")
            print ("\n")
            print ("\n")
        break
    print ("\n")
    print ("\n")
print("    A la prochaine !")

Maintenant le plat de résistance : cercles inscrits et orthocentres...

@+

Hors ligne

#225 01-08-2014 11:36:24

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

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

Bonjour,

yoshi a écrit :

Le module de totomm génère beaucoup beaucoup plus de triangles que le mien et se révèle malgré tout 60 fois plus rapide !!!

Comment ça beaucoup plus de triangles que le tiens? Ton module en oubliait-il?

yoshi a écrit :

En outre, je ne suis plus très sûr maintenant de mon branchement dans son module (et ce depuis la page ou 3 de cette discussion..)

Tu veux dire que ce choix ralentit seulement l'exécution ou bien pire qu'il amène des erreurs ou des incomplétudes?

____

Entre le post #224 et le post #225 il y a une différence dans le module 'def ScalenesAigus(minp,maxp)':

Dans le post #225 les lignes    'a2,b2,c2=a**2,b**2,c**2'     et     'if  a2+b2-c2>0 and a2+c2-b2>0 and b2+c2-a2>0:'    ont disparu.

Est-ce voulu?


@+

Hors ligne

Réponse rapide

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

E-mail (obligatoire)

Message (obligatoire)

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

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
quatre-vingt trois moins quaranteet un
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