On n'a effectivement pas besoin des tableaux.
I- Recherche de x et de somme
Pour trouver x, il suffit de diviser som par 4 et de rechercher le plus grand diviseur du résultat parmi 63, 62,...3,2,1.
Pas besoin de tableau.
II- Maintenant, reste à trouver la composition de somme avec les éléments du tableau segc (qui s'avérera inutile):
1- Les éléments de segc ont la forme 4*n+1 avec n = 0..63 . On doit donc avoir, si on utilise N termes,
somme = (1+4*a0) + (1+4*a1) + (1+4*a(N-1)) avec les ai = 0..63
en posant pour simplifier S = (a0+a1+...+a(N-1))
[1] somme = N + 4*S
On pose (division euclidienne)
[2] somme = 4*P+Q , Q<4
[3] N = 4*n+m , m<4
L'expression [1] devient
4*P+Q = 4*n+m+4*S = m+4(n+S)
et on a (division euclidienne)
[4] m = Q
[5] P = n+S
2- Reste à trouver le plus petit n.
D'après [5] et comme les ai<=63 :
P = n+S <= n+N*63 = n+(4*n+m)*63 = 253*n +63*m = 253*n +63*Q
Donc
P-63*Q <= 253*n
On prendra le plus petit n qui vérifie cette relation. On connait maintenant n et N (cf [3] et [4]) : N=4*n+Q
3- Recherche des éléments de S :
On a (cf [5]) S = P-n et on pose
P-n = 63*A + B , B<63
Alors
S = 63*A + B = 63+63+...63 + B + 0+0...+0
avec A termes 63, un terme B et N-A-1 termes à 0. On a donc
ai = 63 , i=0..A-1
ai = B , i=A
ai = 0 , i=A+1..N-1
D'où
somme = (253 +...+253) + (4*B+1) + (1 +...........+1)
...A fois... ...N-A-1 fois...
4- Le code doit donc faire :
- Calculer P = somme/4
- Calculer Q = somme%4
- Calculer n : en posant t = P-63*Q
- si t<= 0 : n=0
- sinon si t est divisible par 253 n= t/253
- sinon n= t/253+1
- le nombre total de termes est N = 4*n+Q
- il y a n253 = (P-n)/63 termes à 253 (=4*63+1)
- il y a un terme v = (P-n)%63*4+1;
- Il y a n1 = N-n253-1 termes à 1 (=4*0+1)
5- On peut stocker ces caractéristiques dans une structure qui suffit à décrire la décomposition. Par exemple :
1 2 3 4 5 6 7
| struct Somme
{
int x;
int n253;
int v;
int n1;
}; |
L'ensemble du code effectuant ce travail est simple et s'écrit en une quinzaine de lignes :
Partager