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 

Ultime programme RSA ( Matrice et factorisation nbre 1er )
Aller à la page 1, 2, 3, 4, 5  Suivante
 
Poster un nouveau sujet   Répondre au sujet    Apprendre Maple Index du Forum -> Séquences, listes, ensembles, tables ou tableaux...
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
Guimzo



Inscrit le: 02 Juin 2012
Messages: 209

MessagePosté le: 20 Oct 2014 14:53    Sujet du message: Ultime programme RSA ( Matrice et factorisation nbre 1er ) Répondre en citant

Bonjour ALS,

J'espère que ça va et que vous passez de bonnes vacances.
Quand vous avez un petit peu de temps, pourriez-vous m'aidez s'il vous plaît, à fabriquer ce petit programme.
J'ai vu sur un autre forum, que vous aviez fait une séquence pour le jeu SUDOKU ; le programme que je recherche est quasiment similaire.

En fait, l'idée c'est de fabriquer une matrice, avec quelques nombres fixés, et il faut que la somme de chaque chiffres de chaque colonne ( en allant de droite à gauche ) soit le chiffre du nombre qui est situé en dernière ligne selon la colonne considérée.
Quand par exemple la somme des chiffres d'une colonne dépasse 9 ; alors on doit prendre en compte son chiffre des dizaines en retenue afin de calculer les chiffres pour la colonne suivante.

Les nombres des deux premières lignes en fait multipliés entres eux donnent le nombre de la dernière ligne.

Alors j'ai commencé à faire un petit dessin, qui sera sans doute plus explicite. Je le joins à ce post.

P.S. : Dans le dessin l'idée c'est de retrouver donc deux nombres de 5 chiffres chacun.
Il ne faut rechercher que les cases où il y à un petit point " . "


https://scontent-b-fra.xx.fbcdn.net/hphotos-xap1/v/t1.0-9/10492119_1495044020775934_1748444823387033449_n.jpg?oh=08a8e25667a7ce06809d1cd54a5cfc6c&oe=54B46FB2
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: 20 Oct 2014 17:21    Sujet du message: Répondre en citant

Bonjour,

Voici le lien pour la page "Sudoku" sur ce site, dont vous pourrez vous inspirer pour écrire votre propre programme:

http://alamanya.free.fr/themes/sudoku.htm

ALS
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: 20 Oct 2014 17:27    Sujet du message: Répondre en citant

Bonjour ALS,

Merci pour le lien, je vais de suite voir, et je vous montrerai ce que j'aurai pu faire
Sinon voici une autre image explicite de la programmation cherchée :

https://scontent-b-ams.xx.fbcdn.net/hphotos-xpf1/v/t1.0-9/10628224_736654629715808_1231277931362431619_n.jpg?oh=dc5f272881626c6c5b551854f102642e&oe=54EB07A3
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 Oct 2014 2:40    Sujet du message: Répondre en citant

Bonsoir ALS,

Je maitrise vraiment pas les matrices, alors je vais procéder plus avec les expressions classiques de maple.

Alors, dans le dessin ci-joint en haut, si on prend par exemple le chiffre de la 2éme colonne et 1ere ligne soit le chiffre (7*b+6) où 6 est la retenue de 7*9 ; et si on prend le chiffre de la même colonne et ligne 2, alors le chiffre cherché est l'unité de (9*f).

Donc on aurait :

(7*b+6) + (9*f) = un nombre terminant par 9 avec comme conditions...

Voici ce que j'ai pu déjà faire à l'aide de vos précédentes séquences :

========================================
restart;
Digits := 10:
l1 := [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]:
l2 := [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]:
L := [seq(seq(7*b+6+9*f, b = l2), f = l1)]:
res := proc (L::(list(posint)), n::nonnegint) local k, F:
F := NULL:
for k to nops(L) do if `mod`(L[k], 10) = n then F := F, L[k] end if end do:
[F] end proc:
r := res(L, 9):
res := convert(r, set);

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

La séquence me donne donc les possibilités des nombres qui se terminent par 9 pour le chiffre de la dernière ligne.

Mais comment s'y prendre pour que la séquence me renvoie non seulement ces nombres se terminant par 9 ; mais qu'elle me renvoie aussi pour chacun de ces nombres la valeur que prend "b" et "f"...?


Dernière édition par Guimzo le 21 Oct 2014 3:19; édité 2 fois
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 Oct 2014 3:11    Sujet du message: Répondre en citant

Rebonsoir ALS,

On peut procéder autrement :
On va partir du principe que pour "b" et "f" , il y à 10^2 possibilités de couples soit 100 possibilités de couples de nombres :
[0 ; 1] , [0 ; 2]... etc etc etc ... [9 ; 9].

C'est à dire que à la place du "a" et "f" il y à un chiffre entre de 0 à 9.
Donc à partir de là calculer où mènent chacun des 100 couples, et vérifier quels sont lesquels qui vérifient que la somme de leur unité donne 9.

Exemple :

Si on prend le couple [0 ; 1]
On aurait donc :

09*
17
----------
6 3
9 0


Ainsi le couple [0 ; 1] conduit à ce que le chiffre de la 2eme colonne 1ere ligne soit un 6 et celui de la 2 éme colonne et 2éme ligne un 9.

Or 9+6 = 15 et donc l'unité "5" ne convient pas puisqu'il faudrait que l'unité soit un 9.

Donc le couple [ 0 ; 1] pour b et f ne convient pas.

Maintenant l'idée est de faire une séquence qui donne pour chaque couple possible pour b et f les chiffres manquants en 2 éme colonne.

Aidez-moi s'il vous plait ALS...
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 Oct 2014 3:54    Sujet du message: Répondre en citant

(suite)

Alors voici ce qui a été fait de nouveau :

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

s := seq(7*a+6, a = 0 .. 9);
t := seq(9*b, b = 0 .. 9);
l1 := [s]; l2 := [t];
L := [seq(seq(s+t, s = l1), t = l2)];
res := proc (L::(list(posint)), n::nonnegint) local k, F;
F := NULL;
for k to nops(L) do if `mod`(L[k], 10) = n then F := F, L[k] end if end do: [F] end proc:
r := res(L, 9):
res := convert(r, set);

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

En fait c'est pratiquement pareil que l'autre séquence ;ceci dit toujours le même probléme, il s'agit de retrouver les résultats sous forme de couple tels que :

res:= [{0;7;69} ; {1;4;49}........]
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
zozo



Inscrit le: 03 Jan 2013
Messages: 125

MessagePosté le: 21 Oct 2014 9:08    Sujet du message: Répondre en citant

Salut,
Beaucoup de points flous:
abcd*e ou abcd*efgh? qui donne 3 en unité?
pourquoi 7*b+6 et 9*f?
grilles de dimensions différentes dans les 2 messages images ajoutés?
quelles sont les cases fixées au départ?

Pour moi, abcd, efgh = 3769, 4297 et 3769*4297 = 16195393 donc impossible que 3+4 donne 3 en première colonne, ou je n'ai rien compris aux règles.

Code:

> M:=matrix([[0,0,0,0,d,c,b,a],[0,0,0,0,h,g,f,e],[0,0,0,l,k,j,i,3],[0,0,q,p,o,n,m,0],[0,v,u,t,s,r,0,0],[alpha,z,y,x,w,0,0,0],[1,6,1,9,5,3,9,3]]);

                [  0      0    0    0    d    c    b    a]
                [                                        ]
                [  0      0    0    0    h    g    f    e]
                [                                        ]
                [  0      0    0    l    k    j    i    3]
                [                                        ]
           M := [  0      0    q    p    o    n    m    0]
                [                                        ]
                [  0      v    u    t    s    r    0    0]
                [                                        ]
                [alpha    z    y    x    w    0    0    0]
                [                                        ]
                [  1      6    1    9    5    3    9    3]

> # recherche abcd, efgh
> div:=NULL:
> for K in numtheory[divisors](16195393) do
>   if length(K)=4 then div:=div,K fi
> end do:
> div:=[div];

                         div := [3769, 4297]



T'as pas l'original des règles, car là c'est peu compréhensible !

Sorry...
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 Oct 2014 11:23    Sujet du message: Répondre en citant

Bonjour zozo,

Merci beaucoup, le programme est impeccable !!
Oui je m'étais trompé sur une des images et c'est bien deux nombres de 4 chiffres qui étaient cherchés, donc c'est "abcd" et "efgh".

Le programme répond entièrement à ce que je voulais faire.
Maintenant le "truc" c'est de voir comment faire pour généraliser, c'est à dire rentrer des nombres de n'importe quelle taille dans la dernière ligne de résultat et avec donc un chiffre connu 1ere ligne et 1ere colonne.

Mais le programme est fabuleux !! : )
Merci encore.
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 Oct 2014 11:28    Sujet du message: Répondre en citant

Re-bonjour,

Par exemple si je mettais comme nombre en dernière ligne :

5896862977 et comme chiffre de départ 1ere ligne 1ere colonne je mets 3.

Comment généraliser..?
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 Oct 2014 12:00    Sujet du message: Répondre en citant

Bonjour,
Le programme de zozo réadapté donnerait 5896862977 = 82073*71849, soit 2 diviseurs de longueur 5, en changeant la taille de la matrice.
Généraliser, mais comment?
La taille de la matrice dépend de la taille des 2 nbs diviseurs.
Donc on met un peu la charrue devant les boeufs.
De plus, moi non plus, je n'ai pas bien compris la façon de procéder pour remplir cette matrice.
Quel rapport avec le titre du message: ça sert pour l'algorithme RSA?.
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 Oct 2014 12:16    Sujet du message: Répondre en citant

Par exemple:

Si je prends 5896862977 (10 chiffres) on obtient 2 diviseurs premiers de 5 chiffres: 82073 * 71849.

Si je prends 121054679 (9 chiffres) on obtient aussi 2 diviseurs premiers de 5 chiffres: 10007 * 12097.

Donc comment faire pour la taille de la matrice?

Et si j'ai deux diviseurs premiers de taille différente?
Par exemple 6125114581 = 10007 * 612083.
Comment fait-on dans ce cas pour la taille de la matrice?

Donc beaucoup de problèmes à résoudre ...
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 Oct 2014 12:20    Sujet du message: Répondre en citant

Bonjour ALS,

Oui pour 5896862977 on aurait deux nombres de 5 digits :
82073*71849.

Généraliser, c'est à dire que l'on puisse rentrer n'importe quel nombre résultat comme 5896862977 ou etc etc sans modifier à chaque fois la matrice.

Les seules données que l'on rentrerait dans la séquence seraient le nombre de digits des 2 nombres multiplicateurs cherchés, le nombre résultat ( en dernière ligne ) et le chiffre de base 1ere ligne et 1ere colonne.

Oui la taille de la matrice dépend de la taille des diviseurs cherchés, donc comment faire pour que la matrice se synchronise à chaque fois par rapport à la taille des diviseurs..?
Du style, je rentre la simple donnée dans la séquence, taille diviseurs = n ; et donc la matrice se synchronise automatiquement.

Donc on aurait la séquence et on se bornerait à rentrer comme donnée :

Taille diviseurs = n ;
Nombre résultat = m
Chiffre de base ( 1ere colonne 1ere ligne ) = o
Voilà ce que j'entends par généraliser

Le rapport avec la crptologie RSA, c'est que on devrait si vous le voulez bien faire un test avec par exemple :

Nombre résultat : 1522605027922533360535618378132637429718068114961380688657908494580122963258952897654000350692006139

Chiffre de base = 9

Taille diviseurs = 50

C'est ça le lien ; on devrait faire une matrice en conséquence et voir comment réagit Maple, s'il donne le résultat en temps polynomial ou si non ; je le sens bien que ça devrait être du "instantanée"...
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 Oct 2014 12:26    Sujet du message: Répondre en citant

ALS a écrit:
Par exemple:

Si je prends 5896862977 (10 chiffres) on obtient 2 diviseurs premiers de 5 chiffres: 82073 * 71849.

Si je prends 121054679 (9 chiffres) on obtient aussi 2 diviseurs premiers de 5 chiffres: 10007 * 12097.

Donc comment faire pour la taille de la matrice?

Et si j'ai deux diviseurs premiers de taille différente?
Par exemple 6125114581 = 10007 * 612083.
Comment fait-on dans ce cas pour la taille de la matrice?

Donc beaucoup de problèmes à résoudre ...



ALS, pour résoudre tous ces problèmes, on part de l'idée que les deux diviseurs cherchés ont toujours la même taille qui est connue à priori.
Ce que l'on peut facilement vérifier en ce qui concerne la cryptologie RSA.
Les diviseurs cherchés ont la même taille que la partie entière de la racine carrée des nombres semi-premiers de départ.

Par exemple pour le RSA-100, on sait par principe que le nombre possède 100 digits et que par rapport à la partie entière de la racine carrée de ce nombre, les facteurs cherchés ont chacun 50 digits.
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 Oct 2014 14:35    Sujet du message: Répondre en citant

OK, ça pourrait ressembler à ça?

Code:

> construit_matrice:=proc(N::posint,M::posint,O::posint)
> local mat, nb, i, j, reste, div, ligne;
>  mat:=matrix(N+3,N*2):
>  nb:=M:
>  for i to length(nb) do reste:=nb mod 10: mat[N+3,N*2+1-i]:=reste: nb:=(nb-reste)/10 od;
>  div:=NULL:
>  for i in numtheory[divisors](M) do
>   if length(i)=N then div:=div,i fi
>  end do:
>  div:=[div]:
>  for ligne from 1 to 2 do
>  for i to N do mat[ligne,i]:=0 od:
>  for i to N do reste:=div[ligne] mod 10: mat[ligne,N+i]:=reste: div[ligne]:=(div[ligne]-reste)/10 od
> od:
> mat[3,N*2]:=O:
> j:=0:
> for ligne from 3 to 3+N-1 do
>   j:=j+1:
>   for i to N-j do mat[ligne,i]:=0 od:
> od:
> j:=0:
> for ligne from 4 to 3+N-1 do
>   j:=j+1:
>   for i to j do mat[ligne,N*2-i+1]:=0 od:
> od:
>    evalm(mat)
> end proc:
>
> construit_matrice(4,16195393,3);

        [0 , 0 , 0 , 0 , 9 , 6 , 7 , 3]

        [0 , 0 , 0 , 0 , 7 , 9 , 2 , 4]

        [0 , 0 , 0 , mat[3, 4] , mat[3, 5] , mat[3, 6] , mat[3, 7] ,

        3]

        [0 , 0 , mat[4, 3] , mat[4, 4] , mat[4, 5] , mat[4, 6] ,

        mat[4, 7] , 0]

        [0 , mat[5, 2] , mat[5, 3] , mat[5, 4] , mat[5, 5] ,

        mat[5, 6] , 0 , 0]

        [mat[6, 1] , mat[6, 2] , mat[6, 3] , mat[6, 4] , mat[6, 5] ,

        0 , 0 , 0]

        [1 , 6 , 1 , 9 , 5 , 3 , 9 , 3]

> construit_matrice(5,5896862977,3);

        [0 , 0 , 0 , 0 , 0 , 9 , 4 , 8 , 1 , 7]

        [0 , 0 , 0 , 0 , 0 , 3 , 7 , 0 , 2 , 8]

        [0 , 0 , 0 , 0 , mat[3, 5] , mat[3, 6] , mat[3, 7] ,

        mat[3, 8] , mat[3, 9] , 3]

        [0 , 0 , 0 , mat[4, 4] , mat[4, 5] , mat[4, 6] , mat[4, 7] ,

        mat[4, 8] , mat[4, 9] , 0]

        [0 , 0 , mat[5, 3] , mat[5, 4] , mat[5, 5] , mat[5, 6] ,

        mat[5, 7] , mat[5, 8] , 0 , 0]

        [0 , mat[6, 2] , mat[6, 3] , mat[6, 4] , mat[6, 5] ,

        mat[6, 6] , mat[6, 7] , 0 , 0 , 0]

        [mat[7, 1] , mat[7, 2] , mat[7, 3] , mat[7, 4] , mat[7, 5] ,

        mat[7, 6] , 0 , 0 , 0 , 0]

        [5 , 8 , 9 , 6 , 8 , 6 , 2 , 9 , 7 , 7]



Je ne sais pas si l'emplacement des zéros vous convient ainsi.
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 Oct 2014 15:33    Sujet du message: Répondre en citant

Bonjour ALS,

Merci beaucoup, vous êtes un vrai génie, je vous admire tant !
Dommage, la séquence est parfaite, mais j'ai essaye avec un nombre d'une centaine de digits comme nombre résultat, et Maple, n'a pas trouvé le calcul de façon "instantanée" : (
Je le laisse tourner pour voir quand même jusqu'à ce soir...
Mais vous êtes le meilleur, franchement bravo et merci.

Voici ce ce que j'ai rentré dans Maple :

construit_matrice(50,1522605027922533360535618378132637429718068114961380688657908494580122963258952897654000350692006139 ,9);
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 -> Séquences, listes, ensembles, tables ou tableaux... Toutes les heures sont au format GMT + 2 Heures
Aller à la page 1, 2, 3, 4, 5  Suivante
Page 1 sur 5

 
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.