【session 2】Exercise - isNegative 的input in
应该是-1 还是21888242871839275222246405745257275088548364400416034343698204186575808495616?
#50
-
以下代码是我根据Sign template所做的解答 由于isNegative的input signal in不是Array,我加了一步,用Num2Bits转换in。 代码
疑问如果我的in是-1,得到的output是 当 但我对题目的解读是,in是-1的时候应该也能返回out=1 尝试过的解决方法我觉得问题出在转换-1去bit的部分,所以单独跑了一次Num2Bits,发现-1在Num2Bits里等于4294967295(也就是2^32-1)
如果要让IsNegative在 |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment 3 replies
-
首先说明为什么-1会变成4294967295,这可能是由于circom里面表示负数实际上将负数转换为了32位的补码,其二进制表示为11111111111111111111111111111111,即10进制的4294967295。 |
Beta Was this translation helpful? Give feedback.
首先说明为什么-1会变成4294967295,这可能是由于circom里面表示负数实际上将负数转换为了32位的补码,其二进制表示为11111111111111111111111111111111,即10进制的4294967295。
$$(-1) mod 7 = (7-1) mod 7 = 6 mod 7.$$
$$(-5) mod 7 = 2 mod 7 .$$ 在此种情况下 -5实际上与2在有限域上是一致的,那么-5实际上应该是负数还是正数呢?
其次需要说明的是,为什么不能直接输入-1。这个问题涉及到有限域上负数定义的心智模型,即为什么(p/2,p-1]定义为负数? p = 21888242871839275222246405745257275088548364400416034343698204186575808495617.
首先需要明确的是,负数在有限域上并非只是一个数,而是一组mod p相同的数。
考虑 p=7的有限域上的运算:
那么似乎我们只需要circom在处理输入时,将-1转换为p-1就可以表示负数,这样在circom上书写负数也很简单,为什么要这么麻烦地限定(p/2,p-1]来表示负数呢?
这里是为了表示的一致性,考虑更小的负数-5的表示:
这个问题就很显然了,必须定义[0,2/p)的为正数这样才有所谓的正数。而如果用-5去表示的话,会让人很困惑,因为他实际上应该是正数2。因此直接用-1表示,就会违背负数表示的一致性。