Simplifier une équation [Résolu]

Signaler
Messages postés
4199
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
-
Messages postés
4715
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
-
Salut, c'est pas souvent ... mais ça arrive, j'aurais besoin qu'un matheux se penche la dessus :

est-il possible de simplifier ceci :

J = (3 * (X div 3)) + (Y div 3)

N = (3 * (X mod 3)) + (Y mod 3)

sincerement, les equations ... c'est vachement loin (scolairement parlant) ... et je me souviens plus comment on les simplifie...
j'ai bien essayé de "tripoter" dans tout les sens ... mais ... ça donne rien, exemple :J (3*(X+Y)) div 9 gros caca qui pue.

dans le contexte : X et Y vont de 0 a 8
soit
for X := 0 to 8 do
  for Y := 0 to 8 do
  begin
   J[X,Y] := (3*(X div 3))+(Y div 3);
   N[X,Y] := (3*(X mod 3))+(Y mod 3);
  end;

la sequence que j'obtiens etant :
pour J :
  X
Y   0 1 2 3 4 5 6 7 8
  0 0,0,0,1,1,1,2,2,2,
  1 0,0,0,1,1,1,2,2,2,
  2 0,0,0,1,1,1,2,2,2,
  3 3,3,3,4,4,4,5,5,5,
  4 3,3,3,4,4,4,5,5,5,
  5 3,3,3,4,4,4,5,5,5,
  6 6,6,6,7,7,7,8,8,8,
  7 6,6,6,7,7,7,8,8,8,
  8 6,6,6,7,7,7,8,8,8

pour N :
  X
Y   0 1 2 3 4 5 6 7 8
  0
0,1,2,0,1,2,0,1,2,
  1
3,4,5,3,4,5,3,4,5,
  2
6,7,8,6,7,8,6,7,8,
  3
0,1,2,0,1,2,0,1,2,
  4
3,4,5,3,4,5,3,4,5,
  5
6,7,8,6,7,8,6,7,8,
  6
0,1,2,0,1,2,0,1,2,
  7
3,4,5,3,4,5,3,4,5,
  8 6,7,8,6,7,8,6,7,8

Il me semble que je ne puisse simplifier plus les deux equations ... mais dans le doute, je pose la question.

merci a tous pour vos futures réflexions sur ce sujet.
un peu de glucose pour votre cerveau ?

<hr size="2" width="100%" />
A voir également:

20 réponses


Salut f0xi

Désolé mais ce n'est pas simplifiable .

1)Un petit rappel  :
a*(b+c)=a*b+a*c

Ton sentiment de simplification vient d'ici. Sauf que 3 n'est le facteur que de (X div 3)
et non
(Y div 3).

Il aurait fallut que tu es :
(3 * (X div 3)) + (3 *(Y div 3))=3*(
X div 3+Y div 3)

2)La division :

m/a+n/a = (m+n)/a et non (m+n)/(a*a)

Par contre (m/a)*(n/a)=(m*n)/a*a)

Par contre s'il y a autre chose apres (systeme d'équation, dérivée ect ect), il y a peut etre moyen de simplifier des calculs intermédiaires.
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
Salut,

Y'a ça aussi :

type
  TTab = array[0..8,0..8] of byte;




const J : TTab =
((0,0,0,1,1,1,2,2,2),
 (0,0,0,1,1,1,2,2,2),
 (0,0,0,1,1,1,2,2,2),
 (3,3,3,4,4,4,5,5,5),
 (3,3,3,4,4,4,5,5,5),
 (3,3,3,4,4,4,5,5,5),
 (6,6,6,7,7,7,8,8,8),
 (6,6,6,7,7,7,8,8,8),
 (6,6,6,7,7,7,8,8,8));

Salut

<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" /><title></title><meta name="GENERATOR" content="OpenOffice.org 3.0 (Win32)" /><style type="text/css"><!--
@page { margin: 2cm }
P { margin-bottom: 0.21cm }
--></style>Si on regarde de plus près on constate des redondances
 

X

Y  
0 1 2 3 4 5 6 7 8

 

0

0,0,0,1,1,1,2,2,2,
 
1

0,0,0,1,1,1,2,2,2,
 
2

0,0,0,1,1,1,2,2,2,
 
3

3,3,3,4,4,4,5,5,5,
 
4

3,3,3,4,4,4,5,5,5,
 
5

3,3,3,4,4,4,5,5,5,
 
6

6,6,6,7,7,7,8,8,8,
 
7

6,6,6,7,7,7,8,8,8,
 
8

6,6,6,7,7,7,8,8,8

Pourquoi
ne pas faire un tableau de J et utiliser cette redondance:

Var
  X,Y:Integer;
Begin
  For Y:=0 To 8 Do
  If Y Mod 3 =0 Then
    Begin
      For X:=0 To 8 Do
        Begin
          J[X,Y]:=(3*(X div 3))+(Y div 3);
          move(J[X,Y],J[X,Y+1],1);
          move(J[X,Y],J[X,Y+2],1);
        End;
    End;
End;

Je me trompe peut etre mais copier des octets est plus rapide que de refaire un J[X,Y]:=(3*(X div 3))+(Y div 3). Puis en plus tu pourrais utiliser des pointeurs

Arfff le boulet : Y doit alors etre compris entre 0 et 6 sinon aie aie aie

Rectification :

Arfff le boulet :

Var
X,Y:Integer;
Begin
For Y:=0 To 6 Do
If Y Mod 3 =0 Then
Begin
For X:=0 To 8 Do
Begin
J[X,Y]:=(3*(X div 3))+(Y div 3);
move(J[X,Y],J[X,Y+1],1);
move(J[X,Y],J[X,Y+2],1);
End;
End;
End;
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
@Cantador

Si le contexte change c'est pourri bien sûr.   Sinon, c'est ce qui donne la meilleure perf' 

Sinon, y'a aussi ça (sauf erreur) :

var
Qx,Rx,Qy,Ry: Word;
...
for X := 0 to 8 do
  for Y := 0 to 8 do
  begin
   DivMod(X,3,Qx,Rx);
   DivMod(Y,3,Qy,Ry);
   J[X,Y] :=  3 * Qx + Qy; // ou Qx+Qx+Qx+Qy
   N[X,Y] := 3 * Rx + Ry; // ou Rx+Rx+Rx+Ry
  end;
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012

Bonsoir

Juste pour le plaisir !!!

Un petit rappel
  dividende modulo diviseur = dividende - diviseur * ( dividende div diviseur)
 
Si on pose :
  D = Dividende
  d = diviseur



On a alors :
  (D mod d) = D-d*(D div d)        [eq1]
et
  (D div d) = (D-(D mod d))/d      [eq2]



Soit  J 3(X div 3) + (Y div 3) J1 + J2   N 3(X mod 3) + (Y mod 3) N1 + N2
 
En utilisant l'équation [Eq1], et en posant T1=(X div 3) et T2=(Y div 3) on obtient :



J1=3*T1
N1=3*(X mod 3)
  =3*(X-3*(X div 3))
  =3*X-3*3*T1
  =3*X-3*J1
 
J2=T2
N2=(Y mod 3)
  =(Y-3*(Y div 3))
  =Y-3*J2
 
En utilisant l'équation [Eq2], et en posant T1=(X mod 3) et T2=(Y mod 3) on obtient :



N1=3*T1
J1=3*(X div 3)
  =3*(X-(X mod 3))/3
  =X-(X mod 3)
  =X-T1     
 
N2=T2
J2=(Y div 3)
  =(Y-(Y mod 3))/3
  =(Y-T2)/3 
 
Bref, le plus interessant (à première vue) semblerait être le calcul de N1 et de J1
à partie de l'équation [Eq2] soit :



T1 = (X mod 3) 
J  = (X-T1) + (Y div 3)
N  = (3*T1) + (Y mod 3)


En conclusion, cette "simplification" ne change pas grand chose, surtout face à un tableau précalculé.

Cordialement.
<hr />"L'imagination est plus importante que le savoir." Albert Einstein
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
7
"
J = (3 * (X div 3)) + (Y div 3)
N = (3 * (X mod 3)) + (Y mod 3)
"

Pour les mod je ne sais pas du tout, mais pour le div ... moi je vois ceci :

3 * (X div 3)

Ca revient à diviser X par 3, puis multiplier ce résultat par 3 ... autant faire X !

3 * (X / 3) = X
X / 3 = X / 3

L'égalité est justifiée, donc 3 * (X div 3) équivaut à X ...

Tout ce que vois pour l'instant ...

Cordialement, Bacterius !

Bacterius :  (15 Div 2)*2 = 14 et non 15 ;
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
7
Arf zut oui j'ai trop pensé mathématiques et pas assez "nombre entiers".
Ca ne marche que pour les nombres pairs ...
C'est bête ^^
Mais au fond, je me demande si ça ne serait pas plus rapide de travailler en Single et d'utiliser la division décimale (/) plutôt que d'effectuer (en nombre entier, certes) une division puis une multiplication ? Je ne crois pas au fond ...

Cordialement, Bacterius !
Messages postés
4199
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
28
meci francky, c'est un peu plus clair.

en fait, pour generer les 81 chiffres, cela ne prend que 12 a 15 cycles. pas enorme.

j'ai simplifié en utilisant 4 tableaux et 2 additions. je descend a 5 a 7 cycles, ce qui est pas mal.

<hr size="2" width="100%" />
Messages postés
4715
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
12
Salut,
dans le contexte : X et Y vont de 0 a 8
et si le contexte change ?

cantador
Messages postés
4715
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
12
C'est f0xi qui va être content...
va enfin jouer au boulier compteur !

cantador
Messages postés
4199
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
28
salut, merci pour toutes vos reponses.

@Bacterius :

oui X/3*3 = X mais X div 3 * 3 <> X
normal tu avait oublié le contexte des entiers

en fait comme je l'ai dis precedement j'utilise 4 tableaux de 9 valeurs (36) et pas un tableau de 81!

en gros cela donne :

var
  X,Y : integer;
const
  CXA : array[0..8] of integer = (0,0,0,3,3,3,6,6,6);
  CXB : array[0..8] of integer = (0,3,6,0,3,6,0,3,6);
  CYA : array[0..8] of integer = (0,0,0,1,1,1,2,2,2);
  CYB : array[0..8] of integer = (0,1,2,0,1,2,0,1,2);
begin
  for X := 0 to 8 do
    for Y := 0 to 8 do
     Square[X,Y] := @ColRow[CXA[X]+CYA[Y], CXB[X]+CYB[Y]];
end;

puisque le but est de transformer les coordonnées d'une matrice colones+lignes en matrice decoupée en 9 matrices de 3x3
donc de 9x9 a 9x3x3 :)

et vous aurez tous reconnus ... je vous le donne en mille, une grille de Sudoku.
le but etant ben sur d'avoir 3 mode de lecture de la matrice :
en colones ou en lignes par ColRow
et en carré de 3x3 par Square

<hr size="2" width="100%" />
Messages postés
4715
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
12
Je me disais bien que le contexte devait surement avoir son importance sinon
f0xi nous aurait fourni les deux tableaux de résultats en demandant de faire un programme permettant de les obtenir..

Heureusement que f0xi a fait "un peu" l'école buissonnière pendant ses cours de maths sinon, nous serions dans de beaux draps aujourd'hui pour lire ses sources..
Déjà que c'est difficile.. !!!

cantador
Messages postés
131
Date d'inscription
dimanche 29 octobre 2006
Statut
Membre
Dernière intervention
30 novembre 2018
1
Désolé d'intervenir quatre ans après que la discussion soit terminée mais, ayant eu deux questions à poser ces temps-ci, je commence seulement à m'intéresser au forum. Je suis venu faire un tour dans les maths et comme le mot "simplifier" m'attire, j'ai été attiré par ce message.

S'il s'agissait d'une question faisant partie d'un problème, je pense que la réponse attendue était:

Pour le calcul de J: remplacer X par (X mod 3) et Y par (Y mod 3), ce qui donnait:
J = X + Y/3

Pour le calcul de N, je ne vois pas de simplification (car 3*(X mod 3), ce n'est pas égal à (3x mod 9).
Mais si on remplaçait X par (X mod 3) et Y par (Y mod 3), on obtenait
N= 3*X + Y

On s'apercevait alors de ce qui n'était pas évident a priori: N=3*J.
Messages postés
131
Date d'inscription
dimanche 29 octobre 2006
Statut
Membre
Dernière intervention
30 novembre 2018
1
Je me suis mal exprimé et ce que j'ai dit n'est pas clair.

J'aurais dû dire:
Posons
X' := X mod 3
et
Y' := Y mod 3

On s'aperçoit alors que les expressions


J = (3 * (X div 3)) + (Y div 3)
N = (3 * (X mod 3)) + (Y mod 3)

peuvent s'écrire:

J = X' + Y'/3
N = 3X' + Y'
Messages postés
131
Date d'inscription
dimanche 29 octobre 2006
Statut
Membre
Dernière intervention
30 novembre 2018
1
Je m'aperçois que je me suis trompé. Je reprends.

Je maintiens X'= (X mod 3) et Y= (Y mod 3)


Commençons par modifier J.
(X div 3) ça peut aussi s'écrire
. (X- (X Mod 3)) /3
ou
. (X/3) - (X'/3)

Donc si on multiplie ça par 3, on trouve (X - X')

(Y div 3) peut s'écrire (Y-Y')/3 soit (Y/3) - (Y'/3)

Donc J peut s'écrire (X - X') + (Y/3 - Y'/3)


A quoi est égal 3J ?
3J = 3X - 3X' + Y - Y
ou
(3X+Y) - (3X'+Y')

Pour N, aucun calcul à faire, ça vient tout seul

N= 3 X' + Y'.


[i] (On voit bien qu'on ne peut y apporter aucune simplification. C'est la somme de 2
nombres sans lien entre eux. C'est comme si on avait 3a+b , a et b n'ayant aucun lien entre eux.)/i

On voit que 3J = (3 X + Y) - N

d'où

J = X + Y/3 - N/3

Pas terrible comme simplification mais c'est mieux que rien.
Messages postés
4715
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
12
bonjour,

Tu sais, il doit en avoir un paquet de questions sans réponse
depuis 4 ans..

alors bienvenue au club

cantador
Messages postés
131
Date d'inscription
dimanche 29 octobre 2006
Statut
Membre
Dernière intervention
30 novembre 2018
1
D'accord mon intervention n'était pas absolument indispensable mais on ne sait jamais.

Si une commission d'enquête venait un jour vérifier le sérieux du groupe, elle pourrait constater qu'ici on ne rigole pas. Tant qu'il y a de la vie, il y a des réponses.
Messages postés
4715
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
12
cantador