librairie gmp - C - Programmation
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 !
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);
}
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+,
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.
Marsh Posté le 10-02-2016 à 19:37:17
ReplyMarsh 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+,
Marsh Posté le 10-02-2016 à 20:16:11
gilou a écrit : C'est une globale qu'il a défini la: |
J'ai bien vu mais j'attendais une réponse de sa part ...
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
Marsh Posté le 11-02-2016 à 03:05:04
il fau mettre mpz_res donc il va me falloir initialiser les variable
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+,
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 ?
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
?
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+,
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);
}
}