Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#76 13-07-2014 09:01:31
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Bonjour,
Cette fois, c'est propre !
Cochon qui s'en dédit !
# -*- coding: UTF-8 -*-
from math import sqrt
from operator import itemgetter
def MinMax():
print (" +++ Choix des périmères 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 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
if chx in "234":
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,nombre,Trg):
print(" +++ Points intérieurs à distances entières 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)/(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
s=round(sqrt(s)/4,3)
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 Perimètres_et_aires_croissantes(minp,maxp,Trg,Dico):
print(" +++ Triangles triés par aires égales +++\n\n")
Trg=sorted(Trg,key=itemgetter(4)) # tri sur 5e élément d'un tuple
n,cpt=len(Trg),0
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
def AfficheAiresCroissantes_MemePerimetre(Trg):
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
# 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
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
p0,x0,y0,z0,s0=Trg[0]
n,cpt=len(Trg),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:
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
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 à périmètre égal par aires croissantes")
print (" 3. Triangles de même aire ET même périmètre")
print (" 4. Triangles de mêmes aires")
print ()
print (" 5. Quitter le programme")
print ()
print (" ** Votre choix : ** ",end="")
while 1:
chx=input()
if chx=="5":
stoppe=1
break
elif chx in "1 2 3 4":
print ("\n")
minp,maxp=MinMax()
Trg,Dico=Generation_des_Triangles(minp,maxp,Trg,Dico,chx)
if chx =="1":
print()
Points_Intérieurs_triangles(maxp,nombre,Trg)
break
elif chx=="2":
AfficheAiresCroissantes_MemePerimetre(Trg)
break
elif chx=="3":
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 ou 5. Veuillez recommencer s'il vous plaît...")
print ("\n")
print ("\n")
break
print ("\n")
print ("\n")
print (" A la prochaine !")
Choix 1 : c'était ta première demande.
Choix 2 : Liste pour chaque périmètre les triangles par aires croissantes (plutôt anecdotique).
choix 3 : Liste les triangles entre minp et maxp qui ont même périmètre et même aire : ta dernière demande.
Choix 4 : Liste les triangles entre minp et maxp qui ont seulement la même aire.
@+
Hors ligne
#78 13-07-2014 20:07:21
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
RE,
C'est bon, tu es comblé ?
Pas de suggestion d'un autre tri ?
Concernant ce que tu as soumis au post #48, je ne comprends pas ce que tu voulais faire avec cette ligne :
s=dP*sqrt(dP*(dP-AB)*(dP-BC)*(dP-AC))
S'il s'agissait de calculer l'aire du triangle ABC, aucune chance !
p étant le demi-périmètre, la formule de Héron dit :[tex] s=\sqrt{p(p-AB)(p-AC)(p-BC)}[/tex]
J'ai commencé les comparaisons sur les valeurs en décimal, puis je me suis ravisé un peu plus en me souvenant, confus, que j'avais seriné à mes ouailles pendant tant d'années : Pas de comparaisons d'égalité sur des valeurs approchées !
C'est pourquoi je suis parti de la formule de Héron, en appelant p le périmètre et non plus le demi périmètre :
[tex] s=\sqrt{\frac p 2\left(\frac p 2-AB\right)\left(\frac p 2 -AC\right)\left(\frac p 2-BC\right)}[/tex]
[tex]\Leftrightarrow[/tex]
[tex] S=\sqrt{\frac p 2\left(\frac{p-2AB}{2}\right)\left(\frac{p-2AC}{2}\right)\left(\frac{p-2BC}{2}\right)}[/tex]
[tex]\Leftrightarrow[/tex]
[tex] S=\sqrt{\frac{p}{16}(p-2AB)(p-2AC)(p-2BC)}[/tex]
[tex]\Leftrightarrow[/tex]
[tex] S^2=\frac{p}{16}(p-2AB)(p-2AC)(p-2BC)[/tex]
[tex]\Leftrightarrow[/tex]
[tex] 16S^2=p(p-2AB)(p-2AC)(p-2BC)[/tex]
Et j'ai stocké les nombres équivalents à 16 fois le carré des aires que j'ai appelés s s = 16S²...
Ce n'est qu'au moment de l'affichage que j'ai calculé ces aires :
[tex]\frac{\sqrt s}{4}[/tex] que j'ai arrondies à 3 chiffres après la virgule : [tex]round\left(\frac{\sqrt s}{4},3\right)[/tex]
Mais les comparaisons, donc les tris, ont été faits sur 16S² qui sont des entiers...
Les aires s'affichent bien, mais comme les triangles ne sont pas classés en fonction d'elles, il en résulte qu'il est très fastidieux de les comparer,
C'est clair que t'es retrouvé confronté à une problématique qui a dépassé les capacités de programmation d'un débutant : comment trier les aire, tout en gardant associées les périmètres, et les longueurs des côtés.
Alors déjà, les problèmes de tri sont assez complexes : les techniques sont nombreuses (j'ai écrit un prog là-dessus : http://www.bibmath.net/forums/viewtopic.php?id=4734 et notamment #10 écrit en Python 2.7)
Pour sa part Python dispose de sort() et sorted()
sorted() est une fonction et sort() une méthode :
>>> L,M=[2,1,5,3],[3,2,4,1,6]
>>> sorted(L)
[1, 2, 3, 5]
>>> M.sort()
| curseur clignotant
N'affiche rien, alors on demande à voir :
>>> M
[1, 2, 3, 4, 6]
Mais il fallait encore trouvé un algorithme permettant de gérer le tri tout en conservant les indices d'origine...
Mais c'est bien de faire comme Léonard : c'est en sciant que Léonard de Vinci (bon, ça va, je sais, elle est mauvaise).
Blague à part, le mot d'ordre est
- garder une copie quelque part,
- puis essayer, essayer, essayer...
Il y aura beaucoup de déchet, mais tu avanceras...
@+
Hors ligne
#79 14-07-2014 10:05:22
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Salut,
Oui en effet, ça ne marchait pas... Oups!!
Et que d'erreurs!
Et ma formule de héron!! - Bon, pour ma défense, ça c'était une erreur de frappe! - Car je l'utilise tous les jours cette formule: la bonne je précise...
Bon, concernant le post#48 je fais les corrections qui s'imposent en respectant toutefois l'esprit de ce que je voulais faire... Même si c'était stupide, j'assume ma bêtise.
J'ai bien compris ce que tu dis sur les comparaisons qui doivent se faire sur des entiers. J'avais certes déjà noté la remarque de totomm, mais j'avoue qu'à ce moment, comme je l'ai par ailleurs évoqué précédemment: j'effectuais encore mes vérifications 'manuellement' (quand j'en faisais..) sur un logiciel qui donne des résultats précis jusqu'à la millième décimales... - C'est quand même plus simple en faisant comme il faut, plus intelligent et bien évidemment plus fiable car sans risque d'erreur, en effet!
J'en ris maintenant, j'en rougis aussi...
@+
Hors ligne
#80 14-07-2014 10:20:07
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Salut,
Bof ! Qui ne fait pas de fautes de programmation et/ou de frappes ?
Bin, le problème du tri ici est que ce n'est pas un tri "simple" sur un élément : il s'agissait de simuler un tri comme sur un tableur où tu sélectionnes des colonnes et où tu demandes le tri sur l'une d'entre elles !
Il fallait trier au minimum sur 2 colonnes...
Ce que j'ai souvent fait dans mes sous-programmes : ma liste Ordre est une liste de couples (indice, aire) permet de trier sur les aires en conservant les indices associés.
Tiens, à ,propos des indices :
>>> M=[1,3,4,7,6,2]
>>> M[1]
3
>>> M.index(6)
4
Vérification
>>> M[4]
6
index() est une "méthode" associée aux Listes
@+
Hors ligne
#81 14-07-2014 12:53:10
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Re salut,
Puisque tu me demandes si j'ai une autre idée de tri, je me dois de te répondre que pas vraiment pour le moment...
Cela dit, je repense à l'autre fil et à ce cas de triangle à point intérieur M - Sur le schéma c'est O mais omettons ce détail... - dont toutes les distances sont entières, sauf une que l'on peut qualifier de 'presque entière'.
Je te remets le schéma:
![]()
Quelle est la valeur de d?
réponse:
d = sqrt((sqrt(27^2-((30^2+27^2-22^2)/(2*30))^2)-sqrt(23^2-((30^2+23^2-16^2)/(2*30))^2))^2+(((27^2+16^2)-(22^2+23^2))/(2*30))^2)
= 7,00000008573674832857288196931025039126016175908319943405243493038621359254180880675209324222651.....
Donc
J'aurais bien une autre suggestion: celle de rechercher un programme capable de trouver des cas de figures semblables avec par conséquent des valeurs entières pour tous nos segments excepté l'un d'entre-eux que l'on continuera de noter 'd' comme 'distance', dont la valeur sera 'presque entière' comme on l'a vu.
(Les valeurs trouvées devront êtres les plus petites possibles.)
Ce programme sera à mon sens complet, s'il permet de faire les choses suivantes:
- 1) entrer l'écart minimal +/- souhaité (il pourra être infime) entre la valeur de 'd' et l'entier qu'elle approche,
- 2) afficher pour chaque triangle trouvés:
- a) la valeur de 'd' comme suit: d = l' entier approché +/- n (expl: 7 + 8,57[...].10^-8)
et
- b) la position de 'd' puisqu'en effet 'd' peut correspondre à tous les segments de la figure traçable, soit à AB, BC, AC, AM, BM et CM.
Qu'en dis-tu?
Est-ce jouable?
@+
Dernière modification par 0^0 (15-07-2014 23:28:31)
Hors ligne
#82 14-07-2014 13:02:10
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Salut,
Tout est jouable...
Mais il y a un risque de lenteur : Python dispose d'un module qui permet de calculer des nombres décimaux à une précision donnée : 20,30,40,50... décimales,; en contrepartie, les machines sont très ralenties.
Je vais y réfléchir.
@+
Hors ligne
#84 15-07-2014 13:22:26
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Ave,
j'ai vérifié : techniquement, c'est faisable...
Fonctionnement par défaut :
- avec p,x,y,z = 21,6,7,8, la valeur s = p*(p-2*x)(p-2*y)*(p-2*z) = 6615.
La valeur de l'aire (par défaut je le répète) est :
from decimal import Decimal
p,x,y,z = 21,6,7,8
s=p*(p-2*x)*(p-2*y)*(p-2*z)
print (s)
d=Decimal(sqrt(s)/4)
print (d)
print (Decimal(21)-d)
print (Decimal(21-sqrt(s)/4))
Résultats :
6615
20.333162567588939140250658965669572353363037109375
0.6668374324110608597493410343
0.666837432411060859749341034330427646636962890625
On peut également fixer la précision souhaitée.
@+
Hors ligne
#85 15-07-2014 23:27:28
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Bonsoir,
Comptes-tu t'y prendre par les aires?
De plus, pour être sûr de bien avoir été compris et donc pour que tu ne perdes pas de temps, je vais redéfinir ici ce que j'attends quand j'écris 'd':
J'attends un nombre 'presque entier'
définition:
1 nombre 'presque entier' = 1 nombre Entier ± 1 nombre décimal (qui écrit en notation scientifique est caractérisé par un exposant 'n' relativement grand)
Exemple:
Dans le cas illustré plus faut, 'd' peut donc s'écrire comme suit:
d = 7 + 8,57[...].10^-8 (avec le nombre de décimales que l'on voudra pour la partie décimale)
Je pense que c'est une bonne façon d'écrire un nombre 'presque entier'. Cela dit, je reste ouvert.
@+
Hors ligne
#86 16-07-2014 07:09:41
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
RE,
Non, je ne compte pas m'y prendre par les aires (j'aurais parié que tu serais hypnotinsé par elles^_^).
Oui, j'avais bien compris ce que tu entendais par nombre presque entier.
C'était juste un exemple de calcul montrant que, par défaut, le module décimal permet de calculer avec un nombre non négligeable de chiffres décimaux, 48 avec l'exemple, et qu'on pouvait donc attendre un "presque'" entier sans problème à [tex]\pm\, 10^{-48}[/tex] près.
Cette précision devait donc te convenir...
@+
Hors ligne
#87 16-07-2014 14:47:05
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Bonjour,
Non mais c'était juste pour être sûr..
Je me l'étais dit aussi..
Et pour te répondre quant à la précision que ce module décimal permet d'atteindre, je pense qu'elle est suffisante en effet.
Si ton futur programme permet de trouver des configurations dont les segments entiers n'excédent pas disons 150 de longueur et qui génèrent pourtant des presque entiers à partie entière E disons ≤ 100 et à partie décimale a,[...]*10^-n avec n > 10 ce serait déjà pas mal du tout!
Je suis curieux de voir si tel sera le cas. Je pense que oui mais rien ne me permet de l'affirmer pour le moment.
De mon coté je n'en trouve aucune qui soit meilleure que celle illustrée plus haut.
La programmation est vraiment incontournable!
@+
Hors ligne
#88 18-07-2014 11:36:00
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Bonjour,
Bloqué?
Je me rends compte que la formule pour d correspondant à AB, BC ou AC est plus difficile que celle pour d correspondant à AM, BM ou CM.
Peut-être que l'on devrait ne considérer au départ que les cas de figure où d correspond à un segment intérieur? Cela te faciliterait-il les choses?
@+
Hors ligne
#89 18-07-2014 13:01:42
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Salut,
Parce que tu veux aussi pouvoir étudier les cas où le point est extérieur au triangle ???
Chaque chose en son temps...
Donc, bloqué, oui et non.
Oui, parce que je n'ai pas avancé.
Non, parce que je n'ai pas pu m'en occuper : j'ai eu d'autres préoccupations domestiques.
Il est très clair pour moi que le module recherché passera par une adaptation du module de totomm.
Il me reste (parce que si je n'ai pas eu le temps de programmer, j'y pense) :
- à comprendre ce qui déclenche la recherche de distances après avoir déterminé que le point est intérieur.
- à déterminer comment rejeter tout autre configuration (dans l'ordre !) non-entière, entière, entière : entière, non-entière, entière et , entière, entière, non-entière pour les distances du point intérieur.
Je pense créer un "mouchard" qui devra valoir 1 ou 0 : non-entière, entière, et qui, dès qu'il sera passé à 1, ne pourra plus évoluer sauf repasser à 0 en cas de changement de point.
Mais je ne suis qu'au stade du projet, parce que ça ne m'apparaît pas évident à faire et que j'aurai besoin de nombreux tests...
Mais je ne t'oublie pas !
@+
Hors ligne
#90 18-07-2014 13:38:29
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Salut,
Parce que tu veux aussi pouvoir étudier les cas où le point est extérieur au triangle ???
Non non pas du tout.
Je parlais des cas où d n'est pas la longueur d'un segment intérieur (AM, BM ou CM) mais celle d'un des cotés du triangle principal ABC.
..j'ai eu d'autres préoccupations domestiques.
Je comprends, pas de souci.
..Je pense créer un "mouchard" qui devra valoir 1 ou 0 : non-entière, entière, et qui, dès qu'il sera passé à 1, ne pourra plus évoluer sauf repasser à 0 en cas de changement de point.
Idée intéressante! Ne n'avais pas imaginé cette approche.
Je voyais un truc du genre:
On teste toutes les configurations avec des segments entiers sauf un. On vérifie à chaque fois si ce d est un presque entier comme exigé...
(C'est envisageable je crois à partir du corps de programme de totomm avec AB, BC, AC, AM et AC entiers)
Mais je ne suis qu'au stade du projet, parce que ça ne m'apparaît pas évident à faire et que j'aurai besoin de nombreux tests...
Oui j'imagine!!
Pas si évident ce problème...
Et merci de ne pas m'oublier! ;)
@+
Hors ligne
#91 18-07-2014 15:07:05
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
On teste toutes les configurations avec des segments entiers sauf un.
Bin oui, mais le problème est bien là :
comment savoir qu'on est dans une des 3 configurations possibles, avec mon mouchard, par ex, une liste à 3 éléments
[1,0,0], [0,1,0], [0,0,1] et non pas [1,1,0] par ex ?
je ne suis pas sûr du tout (et presque sûr du contraire) que c'est toujours la première distance testée par totomm qui sera non entière.
Mon "mouchard" devra en fait partir dans l'état initial [-1,-1,-1], -1 serait : non traité ; entier on passe à 0, non entier on passe à 1.
0 et 1 seulement comme états ainsi que je l'avais écrit n'est en fait pas suffisant, je pense.
Lorsque j'aurais trouvé l'idée, la programmation ne sera plus qu'une question de technique...
L'idée ! C'est le + important !
Vois-tu, quand j'ai commencé la programmation avec le BASIC de mon Amstrad CPC 6128, j'ai écrit un programme de conjugaison soit incollable, soit te corrigeant (et alors on avait un jeu à 3 niveaux de difficulté), mais je voulais qu'il occupe moins de 64 ko et qu'il pose le moins de questions possibles et notamment sur l'appartenance d'un verbe en ir au 2e ou au 3e groupe...
J'ai mis 6 mois pour trouver l'astuce - sans lexique de verbes bien sûr - et la détermination entre 2e et 3e groupe se faisait en une dizaine de lignes maxi, sans intervention extérieure...
6 mois pour trouver l'idée qui n'existe nulle part et 10 lignes de code : tous les softs, sauf erreur ont des lexiques de verbes, comme un Bescherelle...
@+
Dernière modification par yoshi (18-07-2014 15:17:00)
Hors ligne
#92 18-07-2014 19:43:10
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
L'idée qui fait la différence oui...
Mon idée est plus basique et sans doute bien moins profonde que la tienne! En effet, la solution que j'imaginais ne permet que de trouver les cas de figures où d correspond à la longueur BM et selon une méthode beaucoup plus simplette...
Je te la présente quand-même de manière un peu plus complète:
1) On part de tous les triangles ABC possibles générés à partir de AC et classés par ordre croissants de périmètres, en commençant pour chaque périmètre considéré, de préférence par le triangle de plus grande aire .
>>>>> Rq: pour chaque triangle ABC possible, AB, BC et AC sont entiers et parfaitement définis. On les prend tous.
2) On génère ensuite à partir d'eux, donc pour chacun de ces triangles ABC, tous les triangles AMC intérieurs possibles dont les cotés sont entiers, en ne tenant pas encore compte de BM à cette étape.
>>>>> Rq: pour chaque triangle AMC possible généré correspondent cinq valeurs de travail entières et définies: AB, BC, AC, AM et CM.
3) On teste enfin les longueurs BM selon ma formule:
BM = sqrt((sqrt(AB^2-((AC^2+AB^2-BC^2)/(2*AC))^2)-sqrt(AM^2-((AC^2+AM^2-CM^2)/(2*AC))^2))^2+(((AB^2+CM^2)-(BC^2+AM^2))/(2*AC))^2)
Qu'on peut aussi écrire ainsi:
BM = sqrt((AB^2-BC^2-AM^2+CM^2)^2/(2*AC)^2+(sqrt(AB^2-(AC^2+AB^2-BC^2)^2/(2*AC)^2)-sqrt(AM^2-(AC^2+AM^2-CM^2)^2/(2*AC)^2))^2)
>>>>> Rq: On teste BM en voyant si cette longueur correspond à un entier avec la marge d'erreur permise en rapport avec la petitesse de l'écart recherchée entre 'd' (la longueur 'presque entière' de BM) et l'entier le plus proche.
4) On finit en ne retenant que les cas de figure qui correspondent.
@+
Dernière modification par 0^0 (19-07-2014 19:32:38)
Hors ligne
#93 18-07-2014 20:02:01
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Bonsoir,
Idée à creuser.
Deux questions.
"Rq" = ? Requiem ? Réponse question ? Autre ?
Tu tiens tant que ça à utiliser ta formule "imbuvable" ?
J'ai probablement trouvé où me brancher dans le module totomm, ici :
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
DE cette façon :
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 :
# Mes tripatouillages
Mais jusqu'à maintenant, j'ai fait l'économie de comprendre ce que représentaient les calculs placés immédiatement au dessus et g en particulier...
Pour pouvoir continuer, comme j'ignore donc ce que représentent g, Yc2, Ym2 et consorts, je vais être obligé de poser des print(...) un peu partout pour récupérer les valeurs et les comparer entre elles via des opérations si nécessaire...
Quand j'aurai mis un nom sur ces différentes valeurs calculées, à ce moment-là seulement, je saurais si mon idée est viable ou pas...
Si toi, tu savais, tu me ferais gagner du temps, ou alors pt'êt que totomm va repasser et me (nous) le dire...
Bon, sinon, c'est d'accord, je générerais les triangles par périmètres croissants et les rangerais selon l'item n°2 avant de rechercher tes points.
D'ailleurs pourquoi ne pas le faire aussi dans l'item 1, ce tri préalable ?...
@+
[EDIT]
Raté ! J'ai cru avoir une idée, j'ai testé et...crac !!!
Ma foi, je n'ai donc plus qu'à chercher réellement ce que représentent g et cie : pas moyen donc d'en faire l'économie.
Tant pis...
Dernière modification par yoshi (18-07-2014 21:58:52)
Hors ligne
#94 18-07-2014 22:14:43
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
Idée à creuser.
Elle semble pouvoir remplir son objectif assez facilement..
Deux questions.
"Rq" = ? Requiem ? Réponse question ? Autre ?
Tu tiens tant que ça à utiliser ta formule "imbuvable" ?
'Rq' est l'abréviation de 'Remarque'
Cette formule n'est pas simplifiable outre mesure... Elle est certes longue, mais elle a le mérite de permettre de calculer et donc de tester BM à partir des cinq autres segments.
..Si toi, tu savais, tu me ferais gagner du temps, ou alors pt'êt que totomm va repasser et me (nous) le dire...
Je vais m'y pencher.. Je te dirai si j'en comprends quelque chose.
Bon, sinon, c'est d'accord, je générerais les triangles par périmètres croissants et les rangerais selon l'item n°2 avant de rechercher tes points.
D'ailleurs pourquoi ne pas le faire aussi dans l'item 1, ce tri préalable ?...
Peut-être que les deux peuvent se faire simultanément en effet.
@+
Hors ligne
#95 19-07-2014 09:21:51
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Bonjour,
La nuit portant conseil, j'en suis les calculs de totomm et ta formule "imbuvable" sont une seule et même chose : lui l'a coupée en tranches...
* ABC étant un triangle quelconque : AB, AC, BC sont pris à valeurs entières,
* totomm fixe ensuite des valeurs entières pour AM et BM compatibles pour qu'on n'ait pas le cas de triangles aplatis,
* il calcule enfin CM à [tex]10^{-10}[/tex] près
Si le point M est intérieur (c'est donc après ce test positif que je dois me brancher), il recalcule alors CM et vérifie s'il est entier, si oui --> affichage...
Donc, moi, je dois évacuer le cas où CM est entier et donc bien reprendre le cas où "g n'est pas égal à ...".
Y a plus qu'à...
@+
[EDIT]
1er jet à peaufiner
Affichage Périmètre, AB, AC, BC, AM, BM, int(CM), CM
+++ Points intérieurs à distances entières (moins une) des sommets +++
54 4 13 13 4 4.0
64 9 15 13 9 9.000000000000002
64 11 13 13 11 11.0
64 7 15 15 7 7.0
75 8 6 28 8 8.0
78 8 17 21 8 8.0
80 12 17 17 12 12.0
88 18 19 15 18 18.0
90 11 19 22 11 11.0
90 7 19 26 7 7.000000000000002
98 7 13 34 7 7.000000000000001
98 20 20 19 20 20.000000000000004
98 6 25 25 6 6.0
100 3 25 25 3 3.0
100 21 28 13 21 21.0
Dernière modification par yoshi (19-07-2014 09:39:52)
Hors ligne
#96 19-07-2014 09:48:25
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Bonjour,
Oui donc je vois que c'est en gros la méthode que je préconisais à la différence que c'est CM et non BM qui est évalué, question d'appellations...
Si j'ai bien compris c'est ici que peut être déterminé la petitesse de l'écart que l'on recherche entre d et une valeur entière pour la longueur de CM:
CMd = sqrt((xm - xc)**2 + (ym - yc)**2)
CM=int(CMd + 0.0000001)
if abs(CM - CMd) < 0.000001:
[...]
Le recalcul qui suit doit........
Ah.... messages croisés........
Hors ligne
#97 19-07-2014 09:50:23
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
ton premier jet me semble tout-à-fait prometteur!! Mais il me semble qu'il y a des erreurs...
Le premier nombre apparaissant (je crois que c'est AB) est trop grand!
;)
Dernière modification par 0^0 (19-07-2014 09:54:06)
Hors ligne
#98 19-07-2014 11:06:42
- 0^0
- Membre
- Inscription : 24-06-2014
- Messages : 325
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
Adaptation de ma méthode:
1) On part de tous les triangles ABC possibles générés à partir de AB et classés par ordre croissants de périmètres, en commençant pour chaque périmètre considéré, de préférence par le triangle de plus grande aire .
>>>>> Rq: pour chaque triangle ABC possible, AB, BC et AC sont entiers et parfaitement définis. On les prend tous.
2) On génère ensuite à partir d'eux (ou simultanément si c'est possible), donc pour chacun de ces triangles ABC, tous les triangles AMB intérieurs possibles dont les cotés sont entiers, en ne tenant pas encore compte de BC à cette étape.
>>>>> Rq: pour chaque triangle AMB possible généré correspondent cinq valeurs de travail entières et définies: AB, BC, AC, AM et BM.
3) On teste enfin les longueurs BC selon ma formule:
CM = sqrt((sqrt(AC^2-((AB^2+AC^2-BC^2)/(2*AB))^2)-sqrt(AM^2-((AB^2+AM^2-BM^2)/(2*AB))^2))^2+(((AC^2+BM^2)-(BC^2+AM^2))/(2*AB))^2)
Qu'on peut aussi écrire ainsi:
CM = sqrt((AC^2-BC^2-AM^2+BM^2)^2/(2*AB)^2+(sqrt(AC^2-(AB^2+AC^2-BC^2)^2/(2*AB)^2)-sqrt(AM^2-(AB^2+AM^2-BM^2)^2/(2*AB)^2))^2)
>>>>> Rq: On teste BC en voyant si cette longueur correspond à un entier avec la marge d'erreur permise en rapport avec la petitesse de l'écart recherchée entre 'd' (la longueur 'presque entière' de BC) et l'entier le plus proche.
4) On finit en ne retenant que les cas de figure qui correspondent.
@+
Dernière modification par 0^0 (19-07-2014 19:28:36)
Hors ligne
#99 19-07-2014 12:26:14
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Salut,
J'ai vu les erreurs.
Je suis en train de calculer
avec :
getcontext().prec=25 # précision 10^{-25}
Quand j'aurai une certitude sur le résultat, je me pencherai sur la recherche proprement dite des points.
Bon, le module Decimal de Python ne me casse plus les pieds, un point de réglé...
Avec AC,BC,AB,AM,BM = 27,22,30,23,16
le calcul de CM à 10^-25 près donne 7.00000008573675014389436910278163850307464599609375.
Tiens, il y a un désaccord avec ta valeur (post# 81) après 7.0000000857367...
Tu donnes :
7,00000008573674832857288196931025039126016175908319943405243493038621359254180880675209324222651
Sans le module Decimal Python donne :
7.000000085736752
Avec :
7.00000008573675192025120850303210318088531494140625
Et je précise que ces deux dernières valeurs sont obtenues brutes à partir de ta formule post #81, et cette fois non calculée à partir du module totomm.
J'en déduis qu'elle comporte une erreur ou que le site où tu as fait calculer est dans l'erreur : parce que je suis sûr à 101% (!) de Python...
Si tu as vu un premier jet c'est que la nouvelle fonction est mise en place, le menu refait ; bref tout est en place sauf la nouvelle fonction...
wait and see.
@+
Hors ligne
#100 19-07-2014 13:15:47
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Triangles ayant un point intérieur à distance entière des sommets
Re,
2e jet :
CMe : partie entière de CM
CMd : calcul CM à 10-25 près
49 22 8 19 6 17 4 3.999999999999999555910790149937383830547332763671875
écart [tex]4.41 \times ^{-16}[/tex]
Cohérent ou pas ?
@+
Dernière modification par yoshi (19-07-2014 13:32:57)
Hors ligne







