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.

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