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.

73 lines
1.7 KiB

5 years ago
5 years ago
5 years ago
  1. /*
  2. Copyright 2018 0KIMS association.
  3. This file is part of circom (Zero Knowledge Circuit Compiler).
  4. circom is a free software: you can redistribute it and/or modify it
  5. under the terms of the GNU General Public License as published by
  6. the Free Software Foundation, either version 3 of the License, or
  7. (at your option) any later version.
  8. circom is distributed in the hope that it will be useful, but WITHOUT
  9. ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
  11. License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with circom. If not, see <https://www.gnu.org/licenses/>.
  14. */
  15. /*
  16. This component creates a binary substraction.
  17. Main Constraint:
  18. (in[0][0] * 2^0 + in[0][1] * 2^1 + ..... + in[0][n-1] * 2^(n-1)) +
  19. + 2^n
  20. - (in[1][0] * 2^0 + in[1][1] * 2^1 + ..... + in[1][n-1] * 2^(n-1))
  21. ===
  22. out[0] * 2^0 + out[1] * 2^1 + + out[n-1] *2^(n-1) + aux
  23. out[0] * (out[0] - 1) === 0
  24. out[1] * (out[0] - 1) === 0
  25. .
  26. .
  27. .
  28. out[n-1] * (out[n-1] - 1) === 0
  29. aux * (aux-1) == 0
  30. */
  31. template BinSub(n) {
  32. signal input in[2][n];
  33. signal output out[n];
  34. signal aux;
  35. var lin = 2**n;
  36. var lout = 0;
  37. var i;
  38. for (i=0; i<n; i++) {
  39. lin = lin + in[0][i]*(2**i);
  40. lin = lin - in[1][i]*(2**i);
  41. }
  42. for (i=0; i<n; i++) {
  43. out[i] <-- (lin >> i) & 1;
  44. // Ensure out is binary
  45. out[i] * (out[i] - 1) === 0;
  46. lout = lout + out[i]*(2**i);
  47. }
  48. aux <-- (lin >> n) & 1;
  49. aux*(aux-1) === 0;
  50. lout = lout + aux*(2**n);
  51. // Ensure the sum;
  52. lin === lout;
  53. }