-
课堂上的方法代码实现 pragma circom 2.1.4;
include "circomlib/poseidon.circom";
// include "https://github.com/0xPARC/circom-secp256k1/blob/master/circuits/bigint.circom";
template Num2Bits(n) {
signal input in;
signal output out[n];
var lc1 = 0;
var e2 = 1;
for (var i = 0; i < n; i++) {
out[i] <-- (in >> i) & 1;
out[i] * (out[i] - 1) === 0;
lc1 += out[i] * e2;
e2 = e2 + e2;
}
log("lc1", lc1);
log("in", in);
lc1 === in;
}
template IsEqual (n) {
signal input in[2];
signal inv;
in[0] + (2 ** n) - in[1] ==> inv; // 这个数最大应该是 2^n + 2^n - 0 = 2 * 2^n,位数为 n + 2
var nBits = n + 2;
component n2b = Num2Bits(nBits);
n2b.in <== inv;
signal output out0[nBits];
n2b.out ==> out0;
signal output out;
n2b.out[nBits - 1] ==> out;
}
component main = IsEqual(3); 输入不等输入:
输出:
输入:
输出:
这个方法似乎行不通,或者这里的n和需要对比的数之间有个约束我没搞对? |
Beta Was this translation helpful? Give feedback.
Answered by
readygo67
Apr 28, 2023
Replies: 1 comment 1 reply
-
|
Beta Was this translation helpful? Give feedback.
1 reply
Answer selected by
QlDoors
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
in[0] in[1] inv(5bits). inv(4bits)
8 0 0b10000 无法表示 //5bits. 取最高位 = 1
8 1 0b01111 0b1111 //4bits表示, 最高位=1, 2^ 3=8 没有被借走,所以in[0] >= in[1]
7 0 0b01111 0b1111 //4bits表示, 最高位=1, 2^ 3=8 没有被借走,所以in[0] >= in[1]
4 4 0b01000 0b1000 //4bits表示,最高位=1, 2^ 3=8 没有被借走,所以in[0] >=in[1]
2 7 0b00011 0b0011 //4bits表示,最高位=0, 2^ 3=8 被借走,所以in[0] <in[1]
修改后的代码供参考。