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

#26 28-12-2015 08:22:52

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

Re : Mon "projet" semestre 1

RE,



from time import time
from fractions import gcd
from operator import itemgetter

td=time()
L,L_purge=[(3,4,5)],[]
for a in range(0,1001):
    f=a//2
    for n in range(1,f):
        if a%2==0:
            if (a*a)%(2*n)==0 and n%2==0:
                b=(a*a-n*n)//(2*n)
                c=b+n
                # je stocke les triplets, dans l'ordre a<b<c
                L.append((min(a,b),max(a,b),c))
                #print(" a=",a," b=",b," c=",c)
        else:
            if (a*a)%n==0 and (a*a)%(2*n)!=0:
                b=(a*a-n*n)//(2*n)
                c=b+n
                # je stocke les triplets, dans l'ordre a<b<c
                L.append((min(a,b),max(a,b),c))
                #print(" a=",a," b=",b," c=",c)

# Elimination des doublons, triplons...
L=set(L)
# Tri sur le 2e item en gardant l'ordre des 1ers items
L=sorted(L,key=itemgetter(0,1))

## Je ne garde a,b,c que s'ils sont premiers entre eux
for a,b,c in L:
    if gcd(gcd(a,b),c)==1:
        L_purge.append((a,b,c))
        print("a = ",a," b =",b," c =",c)

tt=time()-td
print(tt)
 

Code modifié :
* calcul du quotient entier f de a par 2
* boucle n de 1 à f
* éliminations des doublons

Sans affichage des triplets
Avec a de 0 à 2001 et n de 1 à f :
chez moi 0.546875 s

Avec a de 0 à 2001 et n de 1 à a :
chez moi 1.03125 s
Gain de temps du simple au double

Avec Affichage des triplets
Avec boucle pour a de 0 à 2001 et n de 1 à f
chez moi 33.484375 s

Avec boucle pour a de 0 à 2001 et n de 1 à a
chez moi 34.734375 s
Le gain de temps 1,25 s est noyé dans le temps pris par l'affichage...

@+

[EDIT]

je pensais que les triplets pères avec a impairs étaient b= (a²-1)/2

Moi aussi, au départ... Bin, non il y en a d'autres.
Exemple : a =  33  b = 56  c = 65 ; (33²-1)/2= 544 !!!!
Curiosité, jusqu'à 2001 aucun a dans ce cas n'est premier...
Maintenant, ce n'est qu'une conjecture difficile à prouver !!! Et pour cause...

and gcd(a,b)==1 and gcd(a,c)==1 and gcd(b,c)==1:

Pourquoi vouloir que a,b,c soient deux à deux premiers entre eux ?
C'est prendre le risque d'éliminations intempestives...
C'est pourquoi je teste si  PGCD(a,b,c) = 1, soit en Python : if gcd(gcd(a,b),c)==1: puisque gcd n'admet que deux arguments...
PGCD(a,b,c)=PGCD(PGCD(a,b), c)

Dernière modification par yoshi (28-12-2015 08:45:25)

Hors ligne

#27 28-12-2015 11:42:07

Terces
Membre
Inscription : 16-07-2015
Messages : 466

Re : Mon "projet" semestre 1

yoshi a écrit :

and gcd(a,b)==1 and gcd(a,c)==1 and gcd(b,c)==1:

Pourquoi vouloir que a,b,c soient deux à deux premiers entre eux ?
C'est prendre le risque d'éliminations intempestives...
C'est pourquoi je teste si  PGCD(a,b,c) = 1, soit en Python : if gcd(gcd(a,b),c)==1: puisque gcd n'admet que deux arguments...
PGCD(a,b,c)=PGCD(PGCD(a,b), c)

Salut, mince en effet, ok pour le gcd(gcd(a,b),c)==1, j'avais essayé gcd(a,b,c) en premier mais je n'avais pas pensé à ca même si j'aurais pu m'en douter sachant ton algorithme.
J'ai un peu continué mes recherches (sur le cas a impair pour le moment) et même si je trouve une solution en fait ca sera comme avant, un truc dur à calculer alors que je voulais faire bien plus simple en disant a impair à pour père ca, a pair pour père ca et hop tous les multiples mais non, d'autant que je ne veux pas en écrire deux fois.

PS: mon n < a*(rac(2)-1) c'est en résolvant a<b en remplaçant b par son expression, j'ai aussi essayé a+1 <= b mais il restait du a² et du a donc j'ai pris un peu plus large et simple.

Dernière modification par Terces (28-12-2015 11:44:52)

Hors ligne

#28 28-12-2015 12:07:45

Terces
Membre
Inscription : 16-07-2015
Messages : 466

Re : Mon "projet" semestre 1

Bon j'ai une conjecture mais je n'ai pas testé beaucoup de cas :

Si a est impair,
on fait la décomposition en facteurs premiers,
si il y en a qui ne sont que puissance 1 alors on les garde, n vaut alors ceux qu'on a gardé au carré mais on enlève ceux qui sont >a(rac(2)-1)
Je vais faire d'autres test au cas ou.

exemple :
945 = 1*3^3*5*7
donc n vaut 1, 25, 49 avec n < a(rac(2)-1)

105 = 1*3*5*7
donc n vaut 1, 9, 25, 49 avec n < a(rac(2)-1)

Je ne sais pas si le n < a(rac(2)-1) conviendra toujours, peut-être que la solution plus restreinte serait mieux (en résolvante a+1 <= b...)
Avec un algo je vais tenter de vérifier (ou réfuter) cette conjecture sur pas mal de a à moins que je le prouve mathématiquement (ou réfute).

Dernière modification par Terces (28-12-2015 12:11:22)

Hors ligne

#29 28-12-2015 12:08:16

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

Re : Mon "projet" semestre 1

Salut,

PS: mon n < a*(rac(2)-1) c'est en résolvant a<b en remplaçant b par son expression, j'ai aussi essayé a+1 <= b mais il restait du a² et du a donc j'ai pris un peu plus large et simple.

Après test, en utilisant f =int((2**0.5-1)*a) je gagne 1/10e s (sans l'affichage) et c'est plus correct.

@+

Hors ligne

#30 28-12-2015 12:20:45

Terces
Membre
Inscription : 16-07-2015
Messages : 466

Re : Mon "projet" semestre 1

Terces a écrit :

Bon j'ai une conjecture mais je n'ai pas testé beaucoup de cas :

Si a est impair,
on fait la décomposition en facteurs premiers,
si il y en a qui ne sont que puissance 1 alors on les garde, n vaut alors ceux qu'on a gardé au carré mais on enlève ceux qui sont >a(rac(2)-1)
Je vais faire d'autres test au cas ou.

exemple :
945 = 1*3^3*5*7
donc n vaut 1, 25, 49 avec n < a(rac(2)-1)

105 = 1*3*5*7
donc n vaut 1, 9, 25, 49 avec n < a(rac(2)-1)

Je ne sais pas si le n < a(rac(2)-1) conviendra toujours, peut-être que la solution plus restreinte serait mieux (en résolvante a+1 <= b...)
Avec un algo je vais tenter de vérifier (ou réfuter) cette conjecture sur pas mal de a à moins que je le prouve mathématiquement (ou réfute).

Désolé mauvaise conjecture^^
on regarde juste la composition en facteurs premiers,
et on les met au carré, on les gardes si < a(rac(2)-1).

exemple :
945 = 1*3^3*5*7
donc n vaut 1,729,25,49 mais on élimine 729 car trop grand.

495 = 1*3²*5*11
n=1,25,81,121 :)

Hors ligne

#31 28-12-2015 12:39:50

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

Re : Mon "projet" semestre 1

Re,

Oublie la décomposition en produits de facteurs premiers, c'est une fausse bonne idée :
- il te faudrait la liste des nombres premiers (jusqu'où ?), éventuellement la construire
- il faudrait disposer d'un module de décomposition en produit de facteurs premiers

Trop gourmand en temps...

@+

Hors ligne

#32 28-12-2015 13:27:18

Terces
Membre
Inscription : 16-07-2015
Messages : 466

Re : Mon "projet" semestre 1

yoshi a écrit :

Re,

Oublie la décomposition en produits de facteurs premiers, c'est une fausse bonne idée :
- il te faudrait la liste des nombres premiers (jusqu'où ?), éventuellement la construire
- il faudrait disposer d'un module de décomposition en produit de facteurs premiers

Trop gourmand en temps...

@+

Oui algorithmiquement c'est long mais mathématiquement c'est assez court comme solution si j'arrive à le prouver.

Hors ligne

#33 28-12-2015 22:16:04

Terces
Membre
Inscription : 16-07-2015
Messages : 466

Re : Mon "projet" semestre 1

Terces a écrit :
yoshi a écrit :

Re,

Oublie la décomposition en produits de facteurs premiers, c'est une fausse bonne idée :
- il te faudrait la liste des nombres premiers (jusqu'où ?), éventuellement la construire
- il faudrait disposer d'un module de décomposition en produit de facteurs premiers

Trop gourmand en temps...

@+

Oui algorithmiquement c'est long mais mathématiquement c'est assez court comme solution si j'arrive à le prouver.

J'avais essayé une demo pour le cas a impair mais rien que le cas a pair, la ca devient trop compliqué, je ne suis plus sur de ce que j'écris et c'est tordu, je vais donner mes dernier résultat sous forme de conjecture...
Je ne pensais pas que c'était si compliqué, je crois que je vais relire le lien du u²-v², 2uv, u²+v² par curiosité car moi j'ai rien de simple.
Après quelques test, je n'ai en fait même pas de conjectures, de toute façon ca me parait trop compliqué pour correspondre à mon objectif de "simplifier" la solution.

PS: comment tu fais pour afficher le numéro des lignes sur tes programmes et pour faire cette beau rendu avec la couleur et tout ca ? :)

Dernière modification par Terces (29-12-2015 00:27:18)

Hors ligne

#34 29-12-2015 08:46:58

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

Re : Mon "projet" semestre 1

Salut,

PS: comment tu fais pour afficher le numéro des lignes sur tes programmes et pour faire cette beau rendu avec la couleur et tout ca ? :)

Rien de plus simple...
Tu copies/colles ton code dans ton post...
Tu le sélectionnes,
tu cliques sur la balise... code <> dans la barre d'outils des messages.
et tu corriges la première balise code en écrivant code=Python...

Tercès a écrit :

J'avais essayé une demo pour le cas a impair mais rien que le cas a pair (...)

Ouh là ! Je te sens démoralisé et prêt à jeter le bébé avec l'eau du bain...
Qu'est-ce que tu n'arrives pas à faire ? Ton histoire avec les facteurs premiers ? Bah... C'est anecdotique du moment que pour avoir a<b tu peux prouver que [tex]-a(1+\sqrt 2)<n<a(\sqrt 2 - 1)[/tex]
et que tu expliques que
n entier et n>0 pour éviter la division par zéro,
tu auras justifié les lignes informatiques :


for a in range(0,1001):
    fin = int(a*(sqrt(2)-1))
    for n in range(1,fin):

Toi, si je comprends bien tu ne voudrais montrer que seuls quelques n sont possibles et le faire via les diviseurs de a² ?
T'as essayé le raisonnement par l'absurde en partant de n non diviseur de a² et montrer que ça ne marche pas ?
Il faudra justifier par contre le [tex]b =\frac{a^2-n^2}{2n}[/tex] et le [tex]c=b+n[/tex]
et montrer que a soit pair ou impair, avec tes conditions, le triplet (a,b,c) est bien toujours Pythagoricien.

Ton approche est originale et inédite.
Ce qui serait peut-être intéressant de montrer c'est que ton système permet de retrouver les triplets donnés par les formules déjà existantes (cf les liens) : tu n'es pas un chercheur en Maths postulant à la médaille Fields (pas encore !) et tu donneras peut-être des idées à un chercheur qui trouvera la démo...

Qu'est-ce qu'on attend de toi exactement dans la réalisation d'un projet semestre ?

Voilà mon code "purgé" et factorisé :

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

from time import time
from fractions import gcd
from operator import itemgetter

def triplets(L,a,n):
    b=(a*a-n*n)//(2*n)
    c=b+n
    #print(" a=",a," b=",b," c=",c)
    # je stocke les triplets que s'ils sont générateurs
    if gcd(gcd(a,b),c)==1:
        L.append((a,b,c))    
    return L
   
td=time()
L=[(3,4,5)]
for a in range(0,101):
    fin=int((2**0.5-1)*a)+1
    for n in range(1,fin):
        if a%2==0:
            if (a*a)%(2*n)==0 and n%2==0:
                triplets(L,a,n)
        else:
            if (a*a)%n==0 and (a*a)%(2*n)!=0:
                triplets(L,a,n)

# Elimination des doublons, triplons...
L=set(L)

# Tri sur le 2e item en gardant l'ordre sur le 1er item
L=sorted(L,key=itemgetter(0,1))

# Affichage des triplets générateurs triés
for a,b,c in L:
    print ("a =",a," b =",b," c =",c)

print(time()-td)

@+

Hors ligne

#35 29-12-2015 12:00:10

Terces
Membre
Inscription : 16-07-2015
Messages : 466

Re : Mon "projet" semestre 1

yoshi a écrit :

Toi, si je comprends bien tu ne voudrais montrer que seuls quelques n sont possibles et le faire via les diviseurs de a² ?

Qu'est-ce qu'on attend de toi exactement dans la réalisation d'un projet semestre ?

En fait, j'aimerais que en ayant a, j'ai une "formule"  à appliquer pour trouver tous les b (et c) tels que abc père, par exemple pour a impair, c'est je crois un truc du style : on prend n2=n² (avec n les diviseurs de a) tels que n2 < a*(2**0.5 - 1) mais il faut aussi que n² ne soit pas un diviseur de a. Mais en fait c'est pas plus utile que ma première version, je calcul reste compliqué si c'est le moyen le plus simple, d'ou le fait que pour le moment les pères ne m'intéressent pas tant.

Exemple a impair :
a = 189 qui a pour diviseurs : 1, 3, 7, 9, 21, 27, 63, 189
rac(189*(rac(2)-1)) ≈ 8.85, on ne prendra donc que les diviseurs ⩽ 8, soit 1, 3, 7 mais 3² = 9 qui divise 189 donc on garde au final 1, 7.
On a donc n = 1², 7²
Donc pour a = 189, les triangles intégraux premiers impairs sont :
a = 189, b = 17 860, c = 17 861
a = 189, b = 340, c = 389

Le projet, c'est trouver les triplets (pour moi) et ensuite on rend notre travail qui doit faire moins de 8 pages et on passe 10 min dans un amphi.

J'ai quand même déjà un théorème un peu mal formulé mais je vais le reformuler je penses :


(1) Si a est pair et supérieur strictement à 4 alors b = (a²-n²)/(2n) avec n tous les diviseurs de a² pairs et strictement inférieurs à a et tels que 2n divise a² et tels que a<b. De plus, il n'y a pas d'autres solutions.

(2) Si a est impair et supérieur strictement à 1 alors b = (a²-n²)/(2n) avec n tous les diviseurs de a² impairs et strictement inférieurs à a et tels que 2n ne divise pas a² et tels que a<b. De plus, il n'y a pas d'autres solutions.

(3) Pour tout a ∈ N*-{1,2} il existe b et c tels que abc est un triangle intégral.


Et je voulais tenter de l'améliorer (le rendre plus simple) avec les pères mais pour le moment, ce n'est pas trop le cas.

Oui la justification de b = (a²-n²)/2n ca c'est évident^^ je les ai les 8 pages (bien que j'hésite à en garder 2 qui sont une conjecture incomplète mais qui m'a pris pas mal de temps de démonstration donc j'ai pas trop envie).

PS: je vois que tu as toujours en tête que mon pseudo est Tercès mais il n'en ai rien^^

Dernière modification par Terces (29-12-2015 12:38:25)

Hors ligne

#36 30-12-2015 01:29:00

Terces
Membre
Inscription : 16-07-2015
Messages : 466

Re : Mon "projet" semestre 1

Re,
Je me suis posé une question (hors projet) et je n'ai pour le moment pas la réponse, mais est-ce que tu crois qu'il existe des tétraèdres avec un coin formé uniquement d'angles droits tels que tous ces cotés soient entiers (ca ok) mais aussi la face opposé (les autres le sont) à ce coin ?
Pour le moment, en me servent de la formule de Héron je n'en ai pas trouvé, j'essayerais de voir si le théorème de Gua peut servir mais pour le moment, je n'ai pas essayé.

Hors ligne

#37 30-12-2015 12:19:20

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

Re : Mon "projet" semestre 1

Salut,

Tu veux parler d'un tétraèdre trirectangle ?
Si ce n'est pas fait, je travaillerais sur un "développé"...
Un tétraèdre trirectangle me semble forcément issu d'un cube...
Je demande à voir le patron d'un tétraèdre trirectangle dont tous les côtés des tr rectangles sont entiers.

@+

Hors ligne

#38 30-12-2015 12:51:04

Terces
Membre
Inscription : 16-07-2015
Messages : 466

Re : Mon "projet" semestre 1

yoshi a écrit :

Salut,

Tu veux parler d'un tétraèdre trirectangle ?
Si ce n'est pas fait, je travaillerais sur un "développé"...
Un tétraèdre trirectangle me semble forcément issu d'un cube...
Je demande à voir le patron d'un tétraèdre trirectangle dont tous les côtés des tr rectangles sont entiers.

@+

Oui c'est ca, merci pour le nom.
Et bien il y en a plein, je t'avais donné ceux < 100.
Voici ceux <= 200 (j'ai dit que OA < OB < OC) :
>>>
OA= 44 OB= 117 OC= 240    AB= 125 BC= 267 CA= 244
OA= 85 OB= 132 OC= 720    AB= 157 BC= 732 CA= 725
OA= 88 OB= 234 OC= 480    AB= 250 BC= 534 CA= 488
OA= 132 OB= 351 OC= 720    AB= 375 BC= 801 CA= 732
OA= 140 OB= 480 OC= 693    AB= 500 BC= 843 CA= 707
OA= 160 OB= 231 OC= 792    AB= 281 BC= 825 CA= 808
OA= 170 OB= 264 OC= 1440    AB= 314 BC= 1464 CA= 1450
OA= 176 OB= 468 OC= 960    AB= 500 BC= 1068 CA= 976
OA= 187 OB= 1020 OC= 1584    AB= 1037 BC= 1884 CA= 1595
OA= 195 OB= 748 OC= 6336    AB= 773 BC= 6380 CA= 6339
>>>
O serait le coin en angles droits.
Pour le premier, rac(44²+117²)=125, rac(117²+240²)=267 et rac(240²+44²)=244.
Mais pour le moment j'en ai pas trouvé tel que le triangle ABC soit entier, les autres sont entiers car dans un triangle rectangle, les deux plus petits cotés ne peuvent pas être tous deux impairs.

PS: Que veux-tu dire par un "développé" ?

Dernière modification par Terces (30-12-2015 12:52:34)

Hors ligne

#39 30-12-2015 14:37:09

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

Re : Mon "projet" semestre 1

Salut,

"Développé", c'est le mot correct pour "patron" :
151230024256451107.jpg

Quelles lettres à la place de X, Y et Z ?
Et il y a semble-t-il un problème...
Si mon triangle YOZ est rectangle isocèle, alors j'ai XY = XZ et le triangle XYZ du bas est équilatéral.

Mais là, soit ça ne marche pas, soit j'ai déconné avec mon développé...
Je vais regarder ça de plus près plus tard...

@+

[EDIT]
C'est bien mieux avec les idées claires :
151230080904296670.png

Dernière modification par yoshi (30-12-2015 20:03:11)

Hors ligne

#40 31-12-2015 09:22:30

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

Re : Mon "projet" semestre 1

Bonjour,

Alors tu as trois triangles rectangles avérés : AOB, AOC et BOC :
Donc AB² = OA²+OB², AC²=OA²+OC² et BC² = OB²+OC²
Ces triangles sont des triangles rectangles à côtés entiers...

Ceci posé, maintenant, je peux t'offrir 2 certitudes :
1. Le triangle ABC est donc un triangle à côtés entiers si les 3 autres le sont.
2. Il est illusoire de chercher si ABC peut être un triangle rectangle intégral. C'est impossible0.
  ABC, le 4e triangle du tétraèdre (en bas sur le dessin)  n'est jamais un triangle rectangle.
   Il y a 3 cas à étudier
   * BC est le plus grand côté.
      Je vais comparer BC² avec AB²+AC²
      BC² = OB²+OC²
      AB²+AC² = OA²+OB²+OA²+OC²=2OA²+OB²+OC²= BC²+2OA²
      La contraposée du théorème de Pythagore te dit que ABC n'est pas rectangle en A.
   * AB est le plus grand côté     
      Je vais comparer AB² avec BC²+AC²
      AB² = OA²+OB²
      BC²+AC² = OB²+OC²+OA²+OC²=2OC²+OA²+OB²= AB²+2OC²
      La contraposée du théorème de Pythagore te dit que ABC n'est pas rectangle en C.
   * AC est le plus grand côté.
      Je vais comparer AC² et AB²+BC²
      AC²=OA²+OC²
      AB²+BC²=OA²+OB²+OB²+OC²= 2OB²+AC²
      La contraposée du théorème de Pythagore te dit que ABC n'est pas rectangle en B.

Concernant le test d'arrêt pour n (avec a > 0) :
[tex]n<a(\sqrt 2 -1)\; \Leftrightarrow\; \frac n a <\sqrt 2 -1 \Leftrightarrow\;\frac n a+1 <\sqrt 2\; \Leftrightarrow\;\frac{(n+a)^2}{a^2}<2\; \Leftrightarrow\;(n+a)^2<2a^2[/tex]
Python est bien meilleur avec des entiers (longueur limitée seulement par la qté de RAM de la bécane) et on évite les problèmes dus à la représentation des réels par les ordis.
Donc 2 façons d'écrire le code :

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

from time import time
from fractions import gcd
from operator import itemgetter

def triplets(L,a,n):
    b=(a*a-n*n)//(2*n)
    c=b+n
    # je ne stocke les triplets que s'ils sont générateurs
    if gcd(gcd(a,b),c)==1:
        L.append((a,b,c))    
    return L

L=[]
min_a,max_a=100,301
td=time()
for a in range(min_a,max_a):
    for n in range(1,a):
        if (a+n)*(a+n) >= 2*a*a:
            break
        if a%2==0:
            if (a*a)%(2*n)==0 and n%2==0:
                triplets(L,a,n)
        else:
            if (a*a)%n==0 and (a*a)%(2*n)!=0:
                triplets(L,a,n)

# Tri sur le 2e item en gardant l'ordre sur le 1er item
L=sorted(L,key=itemgetter(0,1))

# Affichage
for a,b,c in L:
    print (" a =",a," b =",b," c =",c)

print(time()-td)

Ou encore avec while

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

from time import time
from fractions import gcd
from operator import itemgetter

def triplets(L,a,n):
    b=(a*a-n*n)//(2*n)
    c=b+n
    # je ne stocke les triplets que s'ils sont générateurs
    if gcd(gcd(a,b),c)==1:
        L.append((a,b,c))    
    return L
   
L=[]
min_a,max_a=100,301
td=time()
for a in range(min_a,max_a):
    n=1
    while (a+n)*(a+n) < 2*a*a:
        if a%2==0:
            if (a*a)%(2*n)==0 and n%2==0:
                triplets(L,a,n)
        else:
            if (a*a)%n==0 and (a*a)%(2*n)!=0:
                triplets(L,a,n)
        n+=1

# Tri sur le 2e item en gardant l'ordre sur le 1er item
L=sorted(L,key=itemgetter(0,1))

# Affichage
for a,b,c in L:
    print (" a =",a," b =",b," c =",c)

print(time()-td)

Codes optimisés :
* plus de doublons (donc pas besoin de les éliminer)
* stockage immédiat des triplets générateurs

@+

Hors ligne

#41 01-01-2016 18:40:51

Terces
Membre
Inscription : 16-07-2015
Messages : 466

Re : Mon "projet" semestre 1

Voila pour mon programme qui calcule les tétraèdres trirectangles :

Étude algorithmique :
>>>
1-     from math import*
2-     sb=[]
3-     for a in range(3,201):
4-         n=1
5-         while n<0.42*a:                                                                
6-             if a%2==0:                                                              
7-                 if (a*a)%(2*n)==0 and n%2==0:
8-                     sb.append(int((a*a-n*n)/(2*n)))
9-             elif a%2==1:                                                      
10-                 if (a*a)%n==0 and (a*a)%(2*n)!=0:
11-                     sb.append(int((a*a-n*n)/(2*n)))
12-             n+=1
13-         for i in range(len(sb)):
14-             for j in range(len(sb)):
15-                 if sqrt(sb[i]*sb[i]+sb[j]*sb[j])%1==0 and sb[i]<sb[j]:
16-                     print("OA=",a,"OB=",sb[i],"OC=",sb[j]," A B=",int(sqrt(a*a+sb[i]**2)),"BC=",int(sqrt(sb[i]**2+sb[j]**2)),"CA=",int(sqrt(a*a+sb[j]**2)))
17-         sb=[]
>>>
Explications :
1) Importation du module math.
2) On créer une suite sb vide.
3) On va faire varier a de 3 à 200.
4) On fixe n à 1.
5) On utilise la propriété 4 pour augmenter n jusqu'à qu'il soit supérieur à a × (rac(2)-1) qu'on a arrondi au supérieur à 0.42 dans le programme.
6) Si a est pair,
7) Et s'
il respecte les conditions vu dans l'étude mathématique alors :
8) On ajoute à sb la valeur de b correspondant au n qui respecte les conditions avec un certain a.
9) Si a est impair;                                                          
10) Et s'
il respecte les conditions vu dans l'étude mathématique alors :
11) On ajoute à sb la valeur de b correspondant au n qui respecte les conditions avec un certain a.
12) On ajoute 1 à n pour tester tous les cas n<0.42 a.
13) Maintenant, on va faire varier i de 1 à la taille de sb.
14) Pareil pour j.
15) Si il existe deux nombres disons b1 et b2 appartenant à sb tels que b1²+b2² vaut un carré alors et si b2 > b1 :
16) On va afficher tous les cotés avec OA qui vaut a, OB qui vaut b1, OC qui vaut b2 et tous les autres cotés en fonctions de a, b1, b2.
17) On  réinitialise sb pour traiter d'
autres a.
Pour résumer, On va faire varier OA, on regarde donc tous les b aptes à donner un triangle intégrale, il en faudra un pour OC et un pour OB mais comme on peut le voir sur la figure précédente, il faut aussi que OC²+OB² donne un carré donc on va enregistrer tous les b potentiels dans une liste et voir s'il en existe deux tels que b1²+b2² soit un carré, et en prenant également
OB < OC.

Pour ce qui est de savoir si abc peut être entier et bien pour a allant de 1 à 10 000 "j'ai" rien trouvé et mathématiquement je ne vois pas, tu penses qu'il existe un tel tétraèdre trirectangle avec côtés et aires entières ? Quand on regarde l'aire ABC, c'est juste la racine carré des 3 autres aires au carré, ou même avec la formule de héron c'est juste la racine d'un entier, j'aimerais bien en trouver un ou savoir pourquoi il n'y en a pas.

Ton histoire d'entier est pas mal car mon approximation de 0.42 deviendra moins fiable si n devient tres tres grand, enfin ca aide un petit peu ;)

PS: ha oui, ca sert à quoi (pour toi) de mettre ca dns ton programme "#!/usr/bin/python
# -*- coding: utf-8 -*"
je sais que c'est comme un commentaire mais pourquoi ?

Dernière modification par Terces (01-01-2016 19:10:38)

Hors ligne

#42 01-01-2016 20:26:20

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

Re : Mon "projet" semestre 1

Re,

Pour ce qui est de savoir si abc peut être entier et bien pour a allant de 1 à 10 000 "j'ai" rien trouvé

Je présume que tu veux parler du triangle ABC : en géométrie les points sont désignés par des lettre capitales d'imprimerie...

Ensuite, j'ai montré que dans un tétraèdre trirectangles les 3 triangles OAB, OAC et OBC étaient des triangles rectangles intégraux :
1. Le 4e triangle ABC a nécessairement des côtés entiers :
   OAB tr. rect. intégral ==> OA, OB, AB entiers |
   OAC tr. rect. intégral ==> OA, OC, AC entiers |> Les côtés AB, AC, BC sont donc entiers.
   OBC tr. rect. intégral ==> OB, OC, BC entiers  |
2. Le 4e triangle ABC n'est par contre jamais un triangle rectangle.
    Je t'avais écrit :
   

Il y a 3 cas à étudier
   * BC est le plus grand côté.
      Je vais comparer BC² avec AB²+AC²
      BC² = OB²+OC²
      AB²+AC² = OA²+OB²+OA²+OC²=2OA²+OB²+OC²= BC²+2OA²
      La contraposée du théorème de Pythagore te dit que ABC n'est pas rectangle en A.
   * AB est le plus grand côté     
      Je vais comparer AB² avec BC²+AC²
      AB² = OA²+OB²
      BC²+AC² = OB²+OC²+OA²+OC²=2OC²+OA²+OB²= AB²+2OC²
      La contraposée du théorème de Pythagore te dit que ABC n'est pas rectangle en C.
   * AC est le plus grand côté.
      Je vais comparer AC² et AB²+BC²
      AC²=OA²+OC²
      AB²+BC²=OA²+OB²+OB²+OC²= 2OB²+AC²
      La contraposée du théorème de Pythagore te dit que ABC n'est pas rectangle en B.


Quelque chose à redire à ça ?

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

#!/usr/bin/python
Cette ligne est là pour la compatibilité Linux. J'ai trouvé ceci qui te l'expliquera mieux que moi :

When do you

#!/usr/local/bin/python
You are specifying the location to the python executable in your machine, that rest of the script needs to be interpreted with.
You are pointing to python is located at /usr/local/bin/python

Consider the possiblities that in a different machine, python may be installed at /usr/bin/python or /bin/python in those cases, the above #! will fail.
For those cases, we get to call the env executable with argument which will determine the arguments path by searching in the $PATH and use it correctly.

Thus,
#/usr/bin/env python
Will figure out the correct location of python ( /usr/bin/python or /bin/python from $PATH) and make that as the interpreter for rest of the script.
- ( env is almost always located in /usr/bin/ so one need not worry what is env is not present at /usr/bin)

Quant à
# -*- coding: utf-8 -*
il précise l'encodage des caractères.
Va voir ici :
http://sametmax.com/lencoding-en-python … our-toute/

Je note cependant une habitude qui a la vie dure :
from math import *
Pourquoi faire alors que from marth import sqrt suffit ? Pourquoi importer la totalité du module math ?
Une règle d'or en Python : on importe que ce ce dont on a besoin. Pourquoi dans ton cas, s'embarrasser de toute la Trigo, des log et des exponentielles (ainsi que des fonctions hyperboliques) ?
En fait, c'est bien plus complexe que ça :

You should never use from X import * unless you really know what you're doing. You can get symbols from module X that conflict with symbols from another module or even your own program. The only exception I have to that rule is sometimes from math import *.

You can use the form from X import y to get a single thing from a module.

If you use the import X form, not only do you make your usage of the module explicit X.y but you can now use the reload function if you make changes to the module and need to reimport it.

@+

Hors ligne

#43 01-01-2016 21:54:57

Terces
Membre
Inscription : 16-07-2015
Messages : 466

Re : Mon "projet" semestre 1

Re,
Oui j'ai compris qu'il n'était pas rectangle mais ce n'est pas pour ca qu'il n'a pas le droit d'avoir un aire entière ^^
Pour ce qui est du import*, on me la déjà dit mais je ne suis pas un grand programmeur et bien que je cherche l'optimisation, je la cherche principalement sur de "gros éléments" comme les boucles..., Ca doit perdre plus de temps à écrire de mettre un élément précis du module que de faire un simple * enfin je crois. J'essayerais quand même de faire attention, tu en connais un rayon comparé à moi et je te fais confiance.

PS: j'ai regardé un peu le lien mais il faut que je le relises je penses^^ en tout cas il y a des trucs pas mal à la fin je trouves pour les erreurs en les remplaçant par des symboles, j'avais déjà vu des trucs pour des erreurs de saisie au clavier mais je ne m'en souviens plus trop, il faut que je revois ca^^.

Dernière modification par Terces (01-01-2016 22:02:20)

Hors ligne

#44 02-01-2016 09:31:02

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

Re : Mon "projet" semestre 1

Salut,


Pour les erreurs de saisie au clavier, il y a le couple "infernal" :
Try:
Except:
Et notamment Except ValueError

Ca doit perdre plus de temps à écrire de mettre un élément précis du module que de faire un simple *

1. C'est vrai !
    Si je compare, dans ton cas from math import * avec from math import sqrt, tu gagnes 3 caractères !
    Il faut bien avouer que c'est considérable
2. D'un autre côté, toi, tu charges en mémoire tout ce qui figure dans le module math, moi, je ne charge que sqrt ? Où est la perte de temps ?
    De plus avec from math import * tu risques d'importer des trucs - dont tu connais pas le nom exact - et qui génère une incompatibilité avec un de tes noms de variables, fonctions ou classes...
    Bref, pour résumer beaucoup considèrent qu'écrire from X import * est une mauvaise (et malsaine) habitude...

Concernant le 4e triangle.
Maintenant qu'on est d'accord, je vais essayer de comprendre pourquoi tu ne trouves pas d'aires entières...
Mais d'abord, j'examine ton programme...

@+

[EDIT]
C'est bon j'ai compris ton "bricolage"...
J'ai testé a jusqu'à 10000 inclus : pas de triangles avec aires entières...
Va falloir maintenant prouver que c'est toujours vrai....

Dernière modification par yoshi (02-01-2016 11:31:25)

Hors ligne

#45 02-01-2016 15:05:05

Terces
Membre
Inscription : 16-07-2015
Messages : 466

Re : Mon "projet" semestre 1

yoshi a écrit :

Salut,


Pour les erreurs de saisie au clavier, il y a le couple "infernal" :
Try:
Except:
Et notamment Except ValueError

Ca doit perdre plus de temps à écrire de mettre un élément précis du module que de faire un simple *

1. C'est vrai !
    Si je compare, dans ton cas from math import * avec from math import sqrt, tu gagnes 3 caractères !
    Il faut bien avouer que c'est considérable

Re,
En fait je voulais dire dans le sens que import * était sans doute plus rapide que import sqrt en prenant en compte l'importation, je croyais l'avoir dit... mais bon après j'ai traduit les textes anglais et j'ai vu qu'il pouvait y avoir des contradictions mais pour le moment je n'en ai pas eu, ca doit arriver surtout pour des "gros" programmes.

En effet c'est ca que j'avais appris : Except ValueError.

Je ne sais pas si l'aire est toujours non-entière, ais en tout cas la question est intéressante, j'y réfléchirais plus mais étant donné que nous (du moins moi) n'avons pas la formule pour les autres côtés, je vais essayer de jouer sur les arguments pairs/impairs mais pour l'instant ca n'a rien donné, tu as sans doute d'autres idées^^

Hors ligne

#46 02-01-2016 16:49:30

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

Re : Mon "projet" semestre 1

Salut,

Je suis aussi parti sur pair/impair...
Rien trouvé de probant.

Je vais essayer autre chose.

Trouvé ça sur la "toile" :

Un triangle est héronien, ses trois côtés (a, b et c) étant des nombres entiers, son aire est aussi un nombre entier n, si et seulement s'il existe un nombre réel  [tex]\theta[/tex] compris entre 0 et [tex]\pi[/tex] tel que:
\begin{cases}a^2&=b^2+c^2-2bc\cos \theta\\2n&=bc\sin\theta\end{cases}

Ce qui implique que le point (sin, cos) est un point rationnel, hors les points (1,0) et (-1,0), situé dans le quadrant positif du cercle unitaire.

Ça ne me semble pas exploitable...

Ou encore :
http://www.les-mathematiques.net/phorum … 915,343195

ce qui prouve que de tels triangles existent même si ton 4e triangle à la construction bien particulière ne semble pas vouloir se montrer coopératif....

http://mapage.noos.fr/r.ferreol/atelech … ermat.html

@+

Hors ligne

#47 03-01-2016 10:49:53

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

Re : Mon "projet" semestre 1

Re,


Je pense que je tiens la bonne piste.
Je crois que tu as écrit quelque part que le carré de l'aire de ABC est la somme des carrés des aires des triangles OAB, OAC et OBC...
Donc une somme de 3 carrés.
A ce propos j'ai trouvé ceci : https://fr.wikipedia.org/wiki/Th%C3%A9o … arr%C3%A9s
ou encore (mais là, j'ai tendance à nager la brasse coulée) :
https://www.math.ens.fr/enseignement/te … ichier=537

Revenons à ma piste. Je vais essayer quelque chose que tu vas chercher à démolir (ce sera ton boulot !)...
Soit [OH] la hauteur issue de A dans le triangle OBC (*).
[tex]S²=\frac 1 4(OA^2OB^2)+\frac 1 4(OA^2OC^2)+\frac 1 4(OB^2OC^2)[/tex]
D'où
[tex]4S²=OA^2OB^2+OA^2OC^2+OB^2OC^2[/tex]
Si 4S² est un carré parfait, alors S² aussi.
[tex]OA^2OB^2+OA^2OC^2+OB^2OC^2=OA^2(OB^2+OC^2)+OB^2OC^2=OA^2BC^2+OB^2OC^2[/tex]
Relations métriques dans le triangle
OB.OC=OH.BC donc [tex]OB^2.OC^2=OH^2.BC^2[/tex]
Je remplace :
[tex]OA^2OB^2+OA^2OC^2+OB^2OC^2=OA^2BC^2+OB^2OC^2=OA^2.BC^2+OH^2.BC^2= BC^2(OA^2+OH^2)[/tex]
Donc 4S² n'est un carré parfait que si OA²+OH² l'est aussi !
Ce qui signifierait que [tex](OH)\perp (OA)[/tex]
Et puisque H a été choisi tel que [tex](OH)\perp(BC)[/tex]
On en déduirait que (OA)//(BC) ce qui est impossible.
Donc OA²+OH² n'est pas un carré parfait donc 4S² non plus, donc [tex]S_{ABC}²[/tex] non plus.

@+

[EDIT] (*) Rectification : issue de O, bien sûr !

Dernière modification par yoshi (03-01-2016 13:46:01)

Hors ligne

#48 03-01-2016 11:51:24

Terces
Membre
Inscription : 16-07-2015
Messages : 466

Re : Mon "projet" semestre 1

Salut, ok j'ai commencé à y réflechir, [OH] c'est juste la hauteur du triangle OBC ? je ne comprends pas bien le issue de A.

PS, j'ai lancé mon algo de 10 000 à 100 000 et il en a trouvé mais j'ai vérifié sur ma calculette, ce sont des faux, le résultat était de l'ordre de 10^15, python a du arrondir.

Hors ligne

#49 03-01-2016 12:23:35

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

Re : Mon "projet" semestre 1

Re,

Désolé : issue de O !

Ça, c'est fiable !

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

from math import sqrt
from time import time

def cotes(a,n,S):
    b=(a*a-n*n)//(2*n)
    c=b+n
    S.append(b)
    return S

L=[]
min_a,max_a=50000,50501
td=time()
for a in range(min_a,max_a):
    S=[]
    for n in range(1,a):
        if (a+n)*(a+n) >= 2*a*a:
            break
        if a%2==0:
            if (a*a)%(2*n)==0 and n%2==0:
               cotes(a,n,S)
        else:
            if (a*a)%n==0 and (a*a)%(2*n)!=0:
                cotes(a,n,S)                    
    for b1 in S:
        for b2 in S:
            if sqrt(b1**2+b2**2)%1==0 and b1<b2:
                s4=(a*b1)**2+(a*b2)**2+(b1*b2)**2
                if float(int(sqrt(s4)))== sqrt(s4):
                         print ("OK !",a,b1,b2)              
               
print (time()-td)
 

Avec OA=a, OB=b1, OC=b2

@+

Hors ligne

#50 03-01-2016 13:46:08

Terces
Membre
Inscription : 16-07-2015
Messages : 466

Re : Mon "projet" semestre 1

Ha ok, je te tiens au courant après, je vais manger.
Par contre ton algo trouve aussi les faux tétraèdre trirectangles "entiers" à cause de l'arrondi sans doute exemple :
OK ! 39168 665280 383533055
j'ai trouvé le même mais à la calculette ca ne va pas !
Je penses qu'il est possible de s'affranchir de ce genre de problème notamment en suppriment les "gros chiffres" pour ne laisser que la partie décimale mais bon si t'as démonstration est juste alors ca ne sert à rien de le faire.

Dernière modification par Terces (03-01-2016 13:47:28)

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 six moins quatre-vingt 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