Apprendre Maple Index du Forum Apprendre Maple
Site dédié au logiciel de calcul formel Maple
 
  Page d'accueilPage d'accueil   FAQFAQ    RechercherRechercher    Liste des MembresListe des Membres    Groupes d'utilisateursGroupes d'utilisateurs 
S'enregistrerS'enregistrer    ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

Décomposition d'un nombre en difference de puissance de 2

 
Poster un nouveau sujet   Répondre au sujet    Apprendre Maple Index du Forum -> Programmation
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
Guimzo



Inscrit le: 02 Juin 2012
Messages: 209

MessagePosté le: 20 Mar 2015 20:02    Sujet du message: Décomposition d'un nombre en difference de puissance de 2 Répondre en citant

Bonjour ALS,

Vous m'aviez fait une séquence, qui permettait de décomposer un nombre donné, en somme de puissance de 2 ; est-il possible de faire une décomposition, mais cette fois ci, en différence de puissance de 2...?

Voici la séquence pour la décomposition en somme :

==========================================

restart;
Digits := 1000;
DECOMPOSITION := proc (a::nonnegint, b::posint)
local d, q, k;
d := NULL;
q := a;
k := -1;
while 0 < q do k := k+1;
if 0 < `mod`(q, b) then d := (`mod`(q, b))*cat(b, `^`, k), d end if;
q := floor(q/b) end do;
return [d], print(nops([d])) end proc;
DECOMPOSITION(2537, 2)

========================================
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 21 Mar 2015 9:49    Sujet du message: Répondre en citant

Bonjour,
Sur le même principe (celui de la décomposition en base b=2), certainement pas.

Par contre, il est possible de générer aléatoirement des nombres de la forme:

sum(a_k*2^k, k=0..p), où a_k=-1,0, ou 1 (signe devant la puissance 2^k).

Code:

> randomize():
>
> GENERER:=proc(p::nonnegint)
> local k,a,t;
> t:=NULL:
> for k from 0 to p do
>   a[k]:=rand(-1..1)(): 
>   if a[k]=1 then t:=cat(2,`^`, k),t end if: if a[k]=-1 then t:=cat(-2,`^`, k),t end if:
> od:
> sum(a[i]*2^i,i=0..p)=[t]
> end proc:

> GENERER(11);

   3643 = [2^11, 2^10, 2^9, 2^8, -2^7, -2^6, -2^4, 2^3, 2^2, -2^0]



Le résultat pouvant être négatif, on peut retomber sur un entier positif en changeant tous les signes dans le membre de gauche et dans la liste du membre de droite.

A plus.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Guimzo



Inscrit le: 02 Juin 2012
Messages: 209

MessagePosté le: 21 Mar 2015 12:56    Sujet du message: Répondre en citant

Bonjour ALS,

Merci, ce programme est vraiment très intéressant.
J'espère que je suis sur une bonne piste, je vous tiendrais au courant.
Merci encore pour tout,
Bon week end, malgré le mauvais temps : )

P.S.:

Autrement, pour la décomposition d'un nombre donné en différence de puissance de 2, il est vraisemblablement possible, de contourner le probléme, par une astuce ; c'est à dire qu'on commence à faire une décomposition du nombre en somme de puissance de 2 exemple :

2537 = [`2^11`, `2^8`, `2^7`, `2^6`, `2^5`, `2^3`, `2^0`]

Ensuite, on repère la puissance de 2, la plus élevée, ici c'est 2^11 et on écrit la Somme de la suite des puissances de 2, de 2^0 à la puissance la plus élevée du nombre décomposé en somme, donc ici de 2^0 à 2^11, ce qui est égal à 2^12 -2^0 .

Donc la somme de 2^0 à 2^11 = 2^12 - 2^0

Pour finir, on enlève à (2^12 - 2^0) toutes les puissances de 2 qui ne sont pas dans sa décomposition en somme, donc ici on enlève :

2^10, 2^9, 2^4, 2^2, 2^1

On a donc notre nombre de départ 2537 =
2^12 -2^0-2^10- 2^9- 2^4 - 2^2 - 2^1 ou de façon ordonnée :

2^12 -2^10- 2^9- 2^4 - 2^2 - 2^1 - 2^0
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 22 Mar 2015 8:14    Sujet du message: Répondre en citant

Bonjour,
Très bonne astuce que d'avoir pensé à la somme des puissances de 2
2^0+2^1+...+2^n = 2^(n+1)-1.

J'ai donc réussi à écrire une procédure de décomposition en différences de 2:

Code:

> restart;
> Digits := 1000:

> DECOMP_DIFF := proc (a::nonnegint)
> local d,q, k, z;
> z:=NULL;
> q := a;
> k := -1;
> while 0 < q do k := k+1;
> if 0 = `mod`(q, 2) then z:=k,z end if;
> q := floor(q/2) end do;
> d:=cat(2, `^`, k+1):
> for k in [z] do
>   d:=d,-cat(2, `^`, k)
> od:
> d:=d,-cat(2, `^`, 0):
> return [d]:
> end proc:
 
> DECOMP_DIFF(2537);

             [2^12, -2^10, -2^9, -2^4, -2^2, -2^1, -2^0]

> convert(%,`+`);

              2^12 - 2^10 - 2^9 - 2^4 - 2^2 - 2^1 - 2^0



Cela vous convient-il?
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Guimzo



Inscrit le: 02 Juin 2012
Messages: 209

MessagePosté le: 22 Mar 2015 11:00    Sujet du message: Répondre en citant

Bonjour ALS,

La séquence est parfaite : )
Merci, et la séquence d'avant aussi est très intéressante, car elle permet de trouver des formes différentes dans l'écriture d'une valeur donnée, ce qui aide pour une factorisation : )
Je vous ai envoyé un message privé sur une piste pour la factorisation...
À bientôt et mille merci : )
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 23 Mar 2015 8:17    Sujet du message: Répondre en citant

Bonjour,
Votre méthode risque d'être très compliquée pour de très grands nombres semi-premiers.
Cela me fait penser à une méthode de factorisation de Fermat, découverte dans un papier de Danier Perrin.
http://www.math.u-psud.fr/~perrin/Conferences/Rambouillet.pdf
(voir la fin du document).
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Guimzo



Inscrit le: 02 Juin 2012
Messages: 209

MessagePosté le: 23 Mar 2015 15:24    Sujet du message: Répondre en citant

Bonjour ALS,

Merci pour le lien. J'ai lu en survolant, et ça a l'air intéressant, ce soir certainement, j'aurai plus de temps pour essayer de bien comprendre la méthode et pourquoi pas l'adapter à une séquence : )

P.S.1: Voici une liste d'identités en ce qui concerne les puissances de 2, de façon à aider aux factorisations :

(2^n) + (2^(n-1)) + (2^(n-2)) = (2^(n+1)) - (2^(n-2))

(2^n) = (2^(n+1)) - (2^n)

(2^n) + (2^n) = (2^(n+1))

(2^n) - (2^(n+1)) =- (2^n)

(2^(n+1)) - (2^n) - (2^(n-1)) - (2^(n-2)) = (2^(n-2))

(2^n) + (2^(n+1)) + (2^(n+2)) + (2^(n+3)) = (2^(n+4)) - (2^n)

(2^n) + (2^(n+1)) + (2^(n+2)) = (2^(n+3)) - (2^(n+4)) =- (2^n)


J'essaie de factoriser 351 163 en essayant de trouver une méthode bien particulière qui vaudrait pour tous les nombres.
C'est surtout ça "le truc", trouver une méthode qui vaut pour n'importe quel nombre...est-ce qu'il faut mettre toutes les puissances sous la forme d'une puissance maximum, est-ce qu'il faut réduire le nombre de puissances ( dans l'écriture du nombre à factoriser ), est-ce qu'il mettre autant de puissances avec des exposants pairs et impairs etc etc...
Faudrait trouver une méthode, un algorithme bien précis...

Pour 351 163 si vous avez une solution avec la factorisation des puissances de 2, ligne par ligne, je suis preneur.

P.S.2: ALS, pourriez-vous m'expliquer s'il vous plaît, que je comprenne une bonne fois pour toutes, comment bien écrire, une ligne de séquence qui permette de sélectionner un nombre entier dans une liste, parce que ça me fait des erreurs à chaque fois,
Voici un truc simple :


restart;
p:=(12);
s:=seq(2**i,i=1..5):
q:=seq(sqrt(p-j),j=s):

Alors en fait j'ai envie par exemple de sélectionner dans "q" que les résultats entiers ; voici ce que je fais mais ça marche 1 fois sur 2 :

For x in q do if x is integer then print x: end if:end do:

ou bien j'ai fait comme ça aussi mais rien n'y fait :

for x in q if type(x, integer ) then print x: end if:

ou bien comme ça :

select(proc (x) options operator, arrow; type(x, posint) end proc, [q]);

Quelle est la bonne formulation, et pourquoi ça marche pas dans les autres..?
Merci ALS : )

P.S.3: Je suis convaincu qu'on trouvera la solution ALS pour la factorisation, en tout cas je ferai tout pour, quit à passer ma vie entière à chercher...je préfère ça que regarder des émissions bidons à la télé : )
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 24 Mar 2015 10:08    Sujet du message: Répondre en citant

Bonjour,
Voici 2 méthodes pour sélectionner les entiers dans une liste:
la première utilise select, la seconde construit la liste des entiers de [q] à l'aide d'une boucle.

Code:

> restart;
> p:=(12);
> s:=seq(2**i,i=1..5):
> q:=seq(sqrt(p-j),j=s);

                               p := 12


                        1/2     1/2               1/2
                 q := 10   , 2 2   , 2, 2 I, 2 I 5

> l:=select(x->type(x,integer),[q]);

                               l := [2]

> l:=NULL:
> for x in [q] do
>   if type(x,integer) then l:=l,x end if
> end do:
> l:=[l];

                               l := [2]

Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
ALS



Inscrit le: 11 Sep 2006
Messages: 647

MessagePosté le: 24 Mar 2015 11:40    Sujet du message: Répondre en citant

Pour ce qui concerne 351163, en raisonnant à l'envers en supposant que N = 351163 = a^2-b^2 = (a-b)*(a+b), Maple nous donne:

Code:


> isolve(a^2-b^2=351163);
  {a = -175582, b = -175581}, {a = -175582, b = 175581},

        {a = -622, b = -189}, {a = -622, b = 189},

        {a = 622, b = -189}, {a = 622, b = 189},

        {a = 175582, b = -175581}, {a = 175582, b = 175581}



On ne retient que la solution positive non triviale (a-b différent de 1) :
a = 622, b = 189.

Il faut donc partir de N = [`2^18`, `2^16`, `2^14`, `2^12`, `2^11`, `2^9`, `2^8`, `2^7`, `2^5`, `2^4`, `2^3`, `2^1`, `2^0`]

pour arriver à N = 622^2 - 189^2 = 386884 - 35721 = [`2^18`, `2^16`, `2^15`, `2^14`, `2^13`, `2^10`, `2^9`, `2^8`, `2^6`, `2^2`] - [`2^15`, `2^11`, `2^9`, `2^8`, `2^7`, `2^3`, `2^0`]

Ceci devrait vous faciliter la tâche pour compléter les lignes qui vous manquent.

On voit déjà au départ que N=2^18+2^16+2^15-2^15+2^14+.... etc ....
Je vous laisse compléter la suite.
De là à élaborer une stratégie générale de regroupement des termes???
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Guimzo



Inscrit le: 02 Juin 2012
Messages: 209

MessagePosté le: 24 Mar 2015 14:22    Sujet du message: Répondre en citant

Bonjour ALS,

Merci beaucoup pour les 2 méthodes de sélection d'entier : )
Pour 351 163 je bloque justement là, c'est à dire comment passer de son écriture propre, à l'écriture de 622²-189², j'avais effectivement poser le probléme comme ça :

351163 = 622² - 189²

C'est à dire :

écriture1 [`2^18`, `2^16`, `2^14`, `2^12`, `2^11`, `2^9`, `2^8`, `2^7`, `2^5`, `2^4`, `2^3`, `2^1`, `2^0`] =

écriture2" = [`2^18`, `2^16`, `2^15`, `2^14`, `2^13`, `2^10`, `2^9`, `2^8`, `2^6`, `2^2`] - [`2^15`, `2^11`, `2^9`, `2^8`, `2^7`, `2^3`, `2^0`]

écriture2 = `2^18`+ `2^16`+ `2^15`+`2^14`+ `2^13`+ `2^10`+ `2^9`,+`2^8`+`2^6`+ `2^2` - `2^15`- `2^11`- `2^9`- `2^8`- `2^7`- `2^3`- `2^0`

écriture 3 = `2^18`+ `2^16`+`2^14`+ `2^13`+ `2^10`+`2^6`+ `2^2`- `2^11`- `2^7`- `2^3`- `2^0`

Mais je bloque là justement, comment élaborer une méthode valable pour tout nombre, afin de pouvoir passer de l'écriture 1 à l'écriture 2 ou l'écriture 1 à l'écriture 3 et de 3 à 2, (après 2 à 2" c'est évident)...??
Je vais travailler dessus...
Merci pout tout, à bientôt
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Apprendre Maple Index du Forum -> Programmation Toutes les heures sont au format GMT + 2 Heures
Page 1 sur 1

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


phpBB

Développé par phpBB © 2001, 2006 phpBB Group
Traduction par : phpBB-fr.com


Apprendre Maple - ©  - Alain Le Stang - Navigation optimisée pour une résolution 1024 x 768.