librairie gmp

librairie gmp - C - Programmation

Marsh Posté le 10-02-2016 à 00:40:20    

Bonjour, j'ai implémenté ce code avec GMP mais je n'arrive pas à afficher le résultat. Et si quelqu'un peut me débloquer .
 
/****** Edwards curve projective **********
 
 
             Courbe à équation  
           
              x^2+y^2=1+d*x^2*y^2
               
  *****************************************/
 
 
 
#include <gmp.h>
#include <stdio.h>
#include <unistd.h>
#include <assert.h>
 
#define Edwards 'E'
 
 
int main(int argc, char* argv[])
{
 
typedef struct {
mpz_t X;
mpz_t Y;
mpz_t Z;
} point_struct;
 
typedef struct {
 
 mpz_t p;
 mpz_t i;
} curve_struct ;
 
typedef point_struct point_t[1];
typedef curve_struct curve_t[1];
 
 
mpz_t temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8;
 
 
void point_init(point_t P,char model) {
    mpz_init(P->X);
    mpz_init_set_ui(P->Y,1);
    mpz_init_set_ui(P->Z,model == Edwards ? 1 : 0);
}
void point_copy(point_t P,const point_t Q) {
 mpz_set(P->X, Q->X);
 mpz_set(P->Y, Q->Y);
 mpz_set(P->Z, Q->Z);
}
void e_add(point_t res, const point_t P, const point_t Q, const curve_t C) {
 
   
     mpz_mul(temp1, P->X, Q->Z);
     mpz_mod(temp1, temp1, C->p); //Z1*Z2
     mpz_mul(temp2, temp1, temp1);
     mpz_mod(temp2, temp2, C->p); //(Z1*Z2)^2
     mpz_mul(temp3, P->X, Q->X);
     mpz_mod(temp3, temp3, C->p); //X1*X2
     mpz_mul(temp4, P->Y, Q->Y);
     mpz_mod(temp4, temp4, C->p); //Y1*Y2
     mpz_add(temp5, P->X, P->Y);
     mpz_add(temp6, Q->X, Q->Y);
     mpz_mul(temp7, temp5, temp6);
     mpz_mod(temp5, temp7, C->p); //(X1+Y1)*(X2+Y2)
     // A partir de maintenant, on ne touche plus à P et Q,
     //on peut alors toucher à res.
     mpz_mul(temp6, temp3, temp4);
     mpz_mod(temp6, temp6, C->p);
     mpz_mul(temp6, temp6, C->i);
     mpz_mod(temp6, temp6, C->p); //d*X1*X2*Y1*Y2
     mpz_sub(temp7, temp2, temp6);//(Z1*Z2)^2-d*X1*X2*Y1*Y2
     mpz_add(temp8, temp2, temp6);//(Z1*Z2)^2+d*X1*X2*Y1*Y2
     
     mpz_sub(res->X, temp5, temp3);
     mpz_sub(res->X, res->X, temp4);
     mpz_mul(res->X, res->X, temp7);
     mpz_mod(res->X, res->X, C->p);
     mpz_mul(res->X, res->X, temp1);
     mpz_mod(res->X, res->X, C->p);
     
     mpz_sub(res->Y, temp4, temp3);
     mpz_mul(res->Y, res->Y, temp8);
     mpz_mod(res->Y, res->Y, C->p);
     mpz_mul(res->X, temp5, temp1);
     mpz_mod(res->Y, res->Y, C->p);
     
     mpz_mul(res->Z, temp7, temp8);
     mpz_mod(res->Z, res->Z, C->p);
 
      gmp_printf("%Zd\n", e_add);
 
   
 
   
 }  
 
 
 
}
 

Reply

Marsh Posté le 10-02-2016 à 00:40:20   

Reply

Marsh Posté le 10-02-2016 à 08:10:45    

Bonjour !
 
La fonction "main" ne contient que des déclarations (de structures, de variables et de fonctions), mais pas de code ... Votre programme ne fait donc rien du tout ...
 
D'ailleurs, ce serait plus propre de déclarer les structures et fonctions en dehors du main, et cela vous permettrait de voir plus facilement que cette fonction est vide :)
 
Bonne continuation !

Reply

Marsh Posté le 10-02-2016 à 14:30:05    

Merci beaucoup et j'ai modifié le texte comme vous l'avez dit et quand j'exécute il m'affiche erreur de segmentation.
 
/****** Edwards curve projective **********
 
 
             Courbe à équation  
           
              x^2+y^2=1+d*x^2*y^2
               
  *****************************************/
 
 
 
#include <gmp.h>
#include <stdio.h>
#include <unistd.h>
#include <assert.h>
 
#define Edwards 'E'
 
 
 
typedef struct {
mpz_t X;
mpz_t Y;
mpz_t Z;
} point_struct;
 
typedef struct {
 
 mpz_t p;
 mpz_t i;
} curve_struct ;
 
typedef point_struct point_t[1];
typedef curve_struct curve_t[1];
 
 
mpz_t temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8;
int res;
 
 
void point_init(point_t P,char model) {
    mpz_init(P->X);
    mpz_init_set_ui(P->Y,1);
    mpz_init_set_ui(P->Z,model == Edwards ? 1 : 0);
}
void point_copy(point_t P,const point_t Q) {
 mpz_set(P->X, Q->X);
 mpz_set(P->Y, Q->Y);
 mpz_set(P->Z, Q->Z);
}
void e_add(point_t res, const point_t P, const point_t Q, const curve_t C) {
 
   
     mpz_mul(temp1, P->X, Q->Z);
     mpz_mod(temp1, temp1, C->p); //Z1*Z2
     mpz_mul(temp2, temp1, temp1);
     mpz_mod(temp2, temp2, C->p); //(Z1*Z2)^2
     mpz_mul(temp3, P->X, Q->X);
     mpz_mod(temp3, temp3, C->p); //X1*X2
     mpz_mul(temp4, P->Y, Q->Y);
     mpz_mod(temp4, temp4, C->p); //Y1*Y2
     mpz_add(temp5, P->X, P->Y);
     mpz_add(temp6, Q->X, Q->Y);
     mpz_mul(temp7, temp5, temp6);
     mpz_mod(temp5, temp7, C->p); //(X1+Y1)*(X2+Y2)
     // A partir de maintenant, on ne touche plus à P et Q,
     //on peut alors toucher à res.
     mpz_mul(temp6, temp3, temp4);
     mpz_mod(temp6, temp6, C->p);
     mpz_mul(temp6, temp6, C->i);
     mpz_mod(temp6, temp6, C->p); //d*X1*X2*Y1*Y2
     mpz_sub(temp7, temp2, temp6);//(Z1*Z2)^2-d*X1*X2*Y1*Y2
     mpz_add(temp8, temp2, temp6);//(Z1*Z2)^2+d*X1*X2*Y1*Y2
     
     mpz_sub(res->X, temp5, temp3);
     mpz_sub(res->X, res->X, temp4);
     mpz_mul(res->X, res->X, temp7);
     mpz_mod(res->X, res->X, C->p);
     mpz_mul(res->X, res->X, temp1);
     mpz_mod(res->X, res->X, C->p);
     
     mpz_sub(res->Y, temp4, temp3);
     mpz_mul(res->Y, res->Y, temp8);
     mpz_mod(res->Y, res->Y, C->p);
     mpz_mul(res->X, temp5, temp1);
     mpz_mod(res->Y, res->Y, C->p);
     
     mpz_mul(res->Z, temp7, temp8);
     mpz_mod(res->Z, res->Z, C->p);
 
     
}  
 
 
 int main(int argc, char* argv[])  
 {
   
   
 gmp_printf("%Zd\n", e_add);
   
   
   
}

Reply

Marsh Posté le 10-02-2016 à 14:58:54    

Ce qui est normal, vu que votre code est complètement faux.
gmp_printf("%Zd\n",  
ça attends un mpz_t comme second argument et vous lui passez l'adresse de la fonction e_add.
Bref, c'est à se demander si vous comprenez quelque chose au code que vous postez ici.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-02-2016 à 18:46:07    

En fait le code peut passer mai il me dit "erreur de segmentation" ce qui veut dire que j'utilise mal la mémoire. les formules implémentées sont sont celles d'addition  des courbes de d'Edwards en courbes elliptiques.

 

X₃ = (X₁Y₂ + Y₁X₂) ((Ζ₁Ζ₂)² - dX₁X₂Y₁Y₂) Z₁Z₂
       Y₃ = (Y₁Y₂ - X₁X₂) ((Ζ₁Ζ₂)² + dX₁X₂Y₁Y₂) Z₁Z₂
       Z₃ = (Ζ₁Ζ₂)⁴ - (dX₁X₂Y₁Y₂)²

 

je vous rappelle le code que j'ai compilé

 

/****** Edwards curve projective **********

 


             Courbe à équation
         
              x^2+y^2=1+d*x^2*y^2
             
  *****************************************/

  

#include <gmp.h>
#include <stdio.h>
#include <unistd.h>
#include <assert.h>

 

#define Edwards 'E'

  

typedef struct {
mpz_t X;
mpz_t Y;
mpz_t Z;
} point_struct;

 

typedef struct {
 
 mpz_t p;
 mpz_t i;
} curve_struct ;
 
typedef point_struct point_t[1];
typedef curve_struct curve_t[1];

 


mpz_t temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8;
int res;

 


void point_init(point_t P,char model) {
    mpz_init(P->X);
    mpz_init_set_ui(P->Y,1);
    mpz_init_set_ui(P->Z,model == Edwards ? 1 : 0);
}
void point_copy(point_t P,const point_t Q) {
 mpz_set(P->X, Q->X);
 mpz_set(P->Y, Q->Y);
 mpz_set(P->Z, Q->Z);
}
void e_add(point_t res, const point_t P, const point_t Q, const curve_t C) {
 
 
     mpz_mul(temp1, P->X, Q->Z);
     mpz_mod(temp1, temp1, C->p); //Z1*Z2
     mpz_mul(temp2, temp1, temp1);
     mpz_mod(temp2, temp2, C->p); //(Z1*Z2)^2
     mpz_mul(temp3, P->X, Q->X);
     mpz_mod(temp3, temp3, C->p); //X1*X2
     mpz_mul(temp4, P->Y, Q->Y);
     mpz_mod(temp4, temp4, C->p); //Y1*Y2
     mpz_add(temp5, P->X, P->Y);
     mpz_add(temp6, Q->X, Q->Y);
     mpz_mul(temp7, temp5, temp6);
     mpz_mod(temp5, temp7, C->p); //(X1+Y1)*(X2+Y2)
     // A partir de maintenant, on ne touche plus à P et Q,
     //on peut alors toucher à res.
     mpz_mul(temp6, temp3, temp4);
     mpz_mod(temp6, temp6, C->p);
     mpz_mul(temp6, temp6, C->i);
     mpz_mod(temp6, temp6, C->p); //d*X1*X2*Y1*Y2
     mpz_sub(temp7, temp2, temp6);//(Z1*Z2)^2-d*X1*X2*Y1*Y2
     mpz_add(temp8, temp2, temp6);//(Z1*Z2)^2+d*X1*X2*Y1*Y2
     
     mpz_sub(res->X, temp5, temp3);
     mpz_sub(res->X, res->X, temp4);
     mpz_mul(res->X, res->X, temp7);
     mpz_mod(res->X, res->X, C->p);
     mpz_mul(res->X, res->X, temp1);
     mpz_mod(res->X, res->X, C->p);
     
     mpz_sub(res->Y, temp4, temp3);
     mpz_mul(res->Y, res->Y, temp8);
     mpz_mod(res->Y, res->Y, C->p);
     mpz_mul(res->X, temp5, temp1);
     mpz_mod(res->Y, res->Y, C->p);
     
     mpz_mul(res->Z, temp7, temp8);
     mpz_mod(res->Z, res->Z, C->p);

 

   
}

 


 int main(int argc, char* argv[])
 {
 
 
 gmp_printf("%Zd\n", res);
 
 
 
}

 

Merci de votre contribution.

Message cité 1 fois
Message édité par Diose le 10-02-2016 à 19:06:42
Reply

Marsh Posté le 10-02-2016 à 19:37:17    

Diose a écrit :


   
 gmp_printf("%Zd\n", res);


 
C'est quoi res ?  :heink:

Reply

Marsh Posté le 10-02-2016 à 19:43:42    

C'est une globale qu'il a défini la:
int res;
qui n'est pas du bon type et n'est pas initialisée...
Comme le type attendu, opaque, est probablement un type pointeur, et qu'on passe n'importe quoi, pas étonnant qu'on ait un SEGV avec une adresse random.
 
A+,

Message cité 1 fois
Message édité par gilou le 10-02-2016 à 19:56:05

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-02-2016 à 20:16:11    

gilou a écrit :

C'est une globale qu'il a défini la:
int res;
qui n'est pas du bon type et n'est pas initialisée...


 
J'ai bien vu mais j'attendais une réponse de sa part ...

Reply

Marsh Posté le 11-02-2016 à 02:59:52    

res c'est le résultat par exemple résultat de X3 et mon pb c avec les pointeur c pour sa k g erreur de segmentation.
Int res c pa bon car il fau mettre mpz_res qui sera du meme type ke les temp


Message édité par Diose le 11-02-2016 à 03:01:19
Reply

Marsh Posté le 11-02-2016 à 03:05:04    

il fau mettre mpz_res donc il va me falloir initialiser les variable

Reply

Marsh Posté le 11-02-2016 à 03:05:04   

Reply

Marsh Posté le 12-02-2016 à 11:44:17    

> il va me falloir initialiser les variable  
 
Ben c'est sur que si tu as du code pour opérer sur des trucs, mais qu'à aucun moment tu ne donnes de valeur à tes trucs, tu vas pas aller loin.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 12-02-2016 à 14:09:47    

Nommer de manière un peu plus explicite les variables aiderait à la compréhension, parce que là, y'a des "temp" en veux-tu en voilà :/
temp1, temp2, temp3, temp4, temp5,.... Et pourquoi pas temp314 ? :whistle:  


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 13-02-2016 à 00:27:17    

Bonjour ,quelqu'un peut il svp me dire s'il connait comment on affiche le résultat issue de l'addition de 2 points d'une courbe elliptique?
Dans cet le code ci dessous je veux afficher par exemple le point (X3,Y3,Z3) = (X1, Y1,Z1)+(X2,Y2,Z2)
où  X3 = 2X1 + 3Y1Z2, Y3= X1 +Y1 +3Z1 et Z3 = Y2  
?

Reply

Marsh Posté le 14-02-2016 à 00:01:00    

Ben a vue de nez, puisque tes points sont des pointeurs sur des structures de 3 mpz_t, il faut donc afficher chacun des trois.
Donc faire quelque chose comme
gmp_printf("(%Zd, %Zd, %Zd)\n", P->X, P->Y, P->Z);
 
A+,


Message édité par gilou le 14-02-2016 à 00:01:48

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed