Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
964 connectés 

  FORUM HardWare.fr
  Programmation
  C

  librairie gmp

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

librairie gmp

n°2275312
Diose
Posté le 10-02-2016 à 00:40:20  profilanswer
 

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);
 
   
 
   
 }  
 
 
 
}
 

mood
Publicité
Posté le 10-02-2016 à 00:40:20  profilanswer
 

n°2275317
Farian
Posté le 10-02-2016 à 08:10:45  profilanswer
 

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 !

n°2275362
Diose
Posté le 10-02-2016 à 14:30:05  profilanswer
 

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);
   
   
   
}

n°2275368
gilou
Modérateur
Modzilla
Posté le 10-02-2016 à 14:58:54  profilanswer
 

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é!  --
n°2275413
Diose
Posté le 10-02-2016 à 18:46:07  profilanswer
 

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
n°2275419
Totoche17
Posté le 10-02-2016 à 19:37:17  profilanswer
 

Diose a écrit :


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


 
C'est quoi res ?  :heink:

n°2275421
gilou
Modérateur
Modzilla
Posté le 10-02-2016 à 19:43:42  profilanswer
 

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é!  --
n°2275423
Totoche17
Posté le 10-02-2016 à 20:16:11  profilanswer
 

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 ...

n°2275436
Diose
Posté le 11-02-2016 à 02:59:52  profilanswer
 

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
n°2275437
Diose
Posté le 11-02-2016 à 03:05:04  profilanswer
 

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

mood
Publicité
Posté le 11-02-2016 à 03:05:04  profilanswer
 

n°2275548
gilou
Modérateur
Modzilla
Posté le 12-02-2016 à 11:44:17  profilanswer
 

> 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é!  --
n°2275561
rufo
Pas me confondre avec Lycos!
Posté le 12-02-2016 à 14:09:47  profilanswer
 

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
n°2275576
Diose
Posté le 13-02-2016 à 00:27:17  profilanswer
 

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  
?

n°2275611
gilou
Modérateur
Modzilla
Posté le 14-02-2016 à 00:01:00  profilanswer
 

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é!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  librairie gmp

 

Sujets relatifs
Librairie graphiqueLibrairie dynamique et linker
Alias/Versions multiples d'une librairieUtilisation de librairie C avec node.js
Comment wrapper des fonctions dans une librairie statique de Windows?librairie CImg : créer une image à partir d'une matrice
Init librairie externe CrashProblème d'utilisation d'une librairie JS..
librairie IPSec ?À la recherche d'une librairie Kinect opérationnelle ! (2)
Plus de sujets relatifs à : librairie gmp


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR