Skip to content

【session 2】Exercise - isNegative 的input in 应该是-1 还是21888242871839275222246405745257275088548364400416034343698204186575808495616? #50

Discussion options

You must be logged in to vote

首先说明为什么-1会变成4294967295,这可能是由于circom里面表示负数实际上将负数转换为了32位的补码,其二进制表示为11111111111111111111111111111111,即10进制的4294967295。
其次需要说明的是,为什么不能直接输入-1。这个问题涉及到有限域上负数定义的心智模型,即为什么(p/2,p-1]定义为负数? p = 21888242871839275222246405745257275088548364400416034343698204186575808495617.
首先需要明确的是,负数在有限域上并非只是一个数,而是一组mod p相同的数。
考虑 p=7的有限域上的运算:
$$(-1) mod 7 = (7-1) mod 7 = 6 mod 7.$$
那么似乎我们只需要circom在处理输入时,将-1转换为p-1就可以表示负数,这样在circom上书写负数也很简单,为什么要这么麻烦地限定(p/2,p-1]来表示负数呢?
这里是为了表示的一致性,考虑更小的负数-5的表示:
$$(-5) mod 7 = 2 mod 7 .$$ 在此种情况下 -5实际上与2在有限域上是一致的,那么-5实际上应该是负数还是正数呢?
这个问题就很显然了,必须定义[0,2/p)的为正数这样才有所谓的正数。而如果用-5去表示的话,会让人很困惑,因为他实际上应该是正数2。因此直接用-1表示,就会违背负数表示的一致性。

Replies: 1 comment 3 replies

Comment options

You must be logged in to vote
3 replies
@abbylow
Comment options

@dajuguan
Comment options

@abbylow
Comment options

Answer selected by abbylow
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
2 participants