Fp.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include "Fp.hpp"
  2. #include "fpe2scalar.hpp" //problem : Fp does not name a type --> solution : include fpe2scalar.hpp only in the cpp files
  3. Fp Fp::operator-()
  4. {
  5. Fp rop;
  6. fpe_t temp;
  7. fpe_neg(temp,fpe_rep);
  8. rop.set(temp);
  9. return rop;
  10. }
  11. Fp Fp::operator* (Fp b)
  12. {
  13. Fp rop;
  14. fpe_t temp;
  15. fpe_mul(temp,fpe_rep,b.fpe_rep); //b.fpe_rep on peut accéder au champ fpe_rep ici bien qu'il soit privé
  16. fpe_print(stdout,temp);
  17. zout(fpe2mpz(temp));
  18. rop.set(temp);
  19. zout(scalar2mpz(rop.scalar()));
  20. return rop;
  21. }
  22. void Fp::set(fpe_t fpe)
  23. {
  24. //abc;
  25. //zout(scalar_rep[0],scalar_rep[1],scalar_rep[2],scalar_rep[3]);
  26. fpe_set(fpe_rep,fpe);
  27. fpe2scalar(scalar_rep,fpe_rep);
  28. //zout(scalar_rep[0],scalar_rep[1],scalar_rep[2],scalar_rep[3]);
  29. //xyz;
  30. }
  31. void Fp::set_random()
  32. {
  33. fpe_setrandom(fpe_rep);
  34. fpe2scalar(scalar_rep,fpe_rep);
  35. }
  36. void Fp::set_ad_minus_bc(Fp b,Fp c,Fp d) // i1*l1 - j1*k1=1 on calcule i1 = (j1*k1 + 1)*l1^(-1)
  37. {
  38. fpe_ad_minus_bc(fpe_rep,b.fpe_rep,c.fpe_rep,d.fpe_rep);
  39. fpe2scalar(scalar_rep,fpe_rep);
  40. /** bloc pour vérifier si ad-bc=1 en représentation mpz_class, **/
  41. //extern const double bn_v;
  42. //mpz_class bn_u, bn_p;
  43. //zout(bn_v);
  44. //bn_u=1;//pow(bn_v,3); ne marche pas ni bn_v*bn_v*bn_v moral: d'abord initialiser pour travailler avec des mpz_class plutôt que des doubles
  45. //for (int i =0;i<3;i++)
  46. //{
  47. //bn_u*=bn_v;
  48. //}
  49. //bn_p=36 * bn_u * bn_u * bn_u * bn_u+36 * bn_u * bn_u * bn_u+24 * bn_u * bn_u+6 * bn_u + 1;
  50. //zout (fpe2mpz(fpe_rep),fpe2mpz(d.fpe_rep),fpe2mpz(b.fpe_rep),fpe2mpz(c.fpe_rep),fpe2mpz(fpe_rep)*fpe2mpz(d.fpe_rep)-fpe2mpz(b.fpe_rep)*fpe2mpz(c.fpe_rep));
  51. //mpz_class field_element=(fpe2mpz(fpe_rep)*fpe2mpz(d.fpe_rep)-fpe2mpz(b.fpe_rep)*fpe2mpz(c.fpe_rep)) % bn_p;
  52. //field_element = (sgn(field_element)>=0)? field_element :field_element+bn_p; //il faut faire le modulo p et changer le reste de la division tronqué (obtenu avec %) est négatif, le modulo est du même signe que le dividende (celui qu'on divise)
  53. //zout(field_element);
  54. }
  55. const scalar_t& Fp::scalar() const
  56. {
  57. return scalar_rep;
  58. }
  59. void Fp::print_fpe() const
  60. {
  61. cout << fpe_rep << endl;
  62. }