You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

199 lines
3.9 KiB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
  1. #include "zqfield.h"
  2. ZqField::ZqField(PBigInt ap) {
  3. mpz_init_set(p, *ap);
  4. mpz_init_set_ui(zero, 0);
  5. mpz_init_set_ui(one, 1);
  6. nBits = mpz_sizeinbase (p, 2);
  7. mpz_init(mask);
  8. mpz_mul_2exp(mask, one, nBits-1);
  9. mpz_sub(mask, mask, one);
  10. }
  11. ZqField::~ZqField() {
  12. mpz_clear(p);
  13. mpz_clear(zero);
  14. mpz_clear(one);
  15. }
  16. void ZqField::add(PBigInt r, PBigInt a, PBigInt b) {
  17. mpz_add(*r,*a,*b);
  18. if (mpz_cmp(*r, p) >= 0) {
  19. mpz_sub(*r, *r, p);
  20. }
  21. }
  22. void ZqField::sub(PBigInt r, PBigInt a, PBigInt b) {
  23. if (mpz_cmp(*a, *b) >= 0) {
  24. mpz_sub(*r, *a, *b);
  25. } else {
  26. mpz_sub(*r, *b, *a);
  27. mpz_sub(*r, p, *r);
  28. }
  29. }
  30. void ZqField::neg(PBigInt r, PBigInt a) {
  31. if (mpz_sgn(*a) > 0) {
  32. mpz_sub(*r, p, *a);
  33. } else {
  34. mpz_set(*r, *a);
  35. }
  36. }
  37. void ZqField::mul(PBigInt r, PBigInt a, PBigInt b) {
  38. mpz_t tmp;
  39. mpz_init(tmp);
  40. mpz_mul(tmp,*a,*b);
  41. mpz_fdiv_r(*r, tmp, p);
  42. mpz_clear(tmp);
  43. }
  44. void ZqField::div(PBigInt r, PBigInt a, PBigInt b) {
  45. mpz_t tmp;
  46. mpz_init(tmp);
  47. mpz_invert(tmp, *b, p);
  48. mpz_mul(tmp,*a,tmp);
  49. mpz_fdiv_r(*r, tmp, p);
  50. mpz_clear(tmp);
  51. }
  52. void ZqField::idiv(PBigInt r, PBigInt a, PBigInt b) {
  53. mpz_fdiv_q(*r, *a, *b);
  54. }
  55. void ZqField::mod(PBigInt r, PBigInt a, PBigInt b) {
  56. mpz_fdiv_r(*r, *a, *b);
  57. }
  58. void ZqField::pow(PBigInt r, PBigInt a, PBigInt b) {
  59. mpz_powm(*r, *a, *b, p);
  60. }
  61. void ZqField::lt(PBigInt r, PBigInt a, PBigInt b) {
  62. int c = mpz_cmp(*a, *b);
  63. if (c<0) {
  64. mpz_set(*r, one);
  65. } else {
  66. mpz_set(*r, zero);
  67. }
  68. }
  69. void ZqField::eq(PBigInt r, PBigInt a, PBigInt b) {
  70. int c = mpz_cmp(*a, *b);
  71. if (c==0) {
  72. mpz_set(*r, one);
  73. } else {
  74. mpz_set(*r, zero);
  75. }
  76. }
  77. void ZqField::gt(PBigInt r, PBigInt a, PBigInt b) {
  78. int c = mpz_cmp(*a, *b);
  79. if (c>0) {
  80. mpz_set(*r, one);
  81. } else {
  82. mpz_set(*r, zero);
  83. }
  84. }
  85. void ZqField::leq(PBigInt r, PBigInt a, PBigInt b) {
  86. int c = mpz_cmp(*a, *b);
  87. if (c<=0) {
  88. mpz_set(*r, one);
  89. } else {
  90. mpz_set(*r, zero);
  91. }
  92. }
  93. void ZqField::geq(PBigInt r, PBigInt a, PBigInt b) {
  94. int c = mpz_cmp(*a, *b);
  95. if (c>=0) {
  96. mpz_set(*r, one);
  97. } else {
  98. mpz_set(*r, zero);
  99. }
  100. }
  101. void ZqField::neq(PBigInt r, PBigInt a, PBigInt b) {
  102. int c = mpz_cmp(*a, *b);
  103. if (c!=0) {
  104. mpz_set(*r, one);
  105. } else {
  106. mpz_set(*r, zero);
  107. }
  108. }
  109. void ZqField::land(PBigInt r, PBigInt a, PBigInt b) {
  110. if (mpz_sgn(*a) && mpz_sgn(*b)) {
  111. mpz_set(*r, one);
  112. } else {
  113. mpz_set(*r, zero);
  114. }
  115. }
  116. void ZqField::lor(PBigInt r, PBigInt a, PBigInt b) {
  117. if (mpz_sgn(*a) || mpz_sgn(*b)) {
  118. mpz_set(*r, one);
  119. } else {
  120. mpz_set(*r, zero);
  121. }
  122. }
  123. void ZqField::lnot(PBigInt r, PBigInt a) {
  124. if (mpz_sgn(*a)) {
  125. mpz_set(*r, zero);
  126. } else {
  127. mpz_set(*r, one);
  128. }
  129. }
  130. int ZqField::isTrue(PBigInt a) {
  131. return mpz_sgn(*a);
  132. }
  133. void ZqField::copyn(PBigInt a, PBigInt b, int n) {
  134. for (int i=0;i<n; i++) mpz_set(a[i], b[i]);
  135. }
  136. void ZqField::band(PBigInt r, PBigInt a, PBigInt b) {
  137. mpz_and(*r, *a, *b);
  138. mpz_and(*r, *r, mask);
  139. }
  140. void ZqField::bor(PBigInt r, PBigInt a, PBigInt b) {
  141. mpz_ior(*r, *a, *b);
  142. mpz_and(*r, *r, mask);
  143. }
  144. void ZqField::bxor(PBigInt r, PBigInt a, PBigInt b) {
  145. mpz_xor(*r, *a, *b);
  146. mpz_and(*r, *r, mask);
  147. }
  148. void ZqField::bnot(PBigInt r, PBigInt a) {
  149. mpz_xor(*r, *a, mask);
  150. mpz_and(*r, *r, mask);
  151. }
  152. void ZqField::shl(PBigInt r, PBigInt a, PBigInt b) {
  153. if (mpz_cmp_ui(*b, nBits) >= 0) {
  154. mpz_set(*r, zero);
  155. } else {
  156. mpz_mul_2exp(*r, *a, mpz_get_ui(*b));
  157. mpz_and(*r, *r, mask);
  158. }
  159. }
  160. void ZqField::shr(PBigInt r, PBigInt a, PBigInt b) {
  161. if (mpz_cmp_ui(*b, nBits) >= 0) {
  162. mpz_set(*r, zero);
  163. } else {
  164. mpz_tdiv_q_2exp(*r, *a, mpz_get_ui(*b));
  165. mpz_and(*r, *r, mask);
  166. }
  167. }
  168. int ZqField::toInt(PBigInt a) {
  169. return mpz_get_si (*a);
  170. }