Make sqrt_flagged more deterministic #2239
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR makes sqrt flagged more deterministic by using a trick I learned from Dan Boneh for how to witness non-squareness. The trick is the following. First, fix a non-square m. Then for any x in F, x is a non-square iff m*x is a square. Thus, if you want to show that x is not a square, you can simply show that mx is a non-square, which you can do by witnessing the square root.
The square_root flagged function is semantically
We implement this with a snarky program as follows (prover blocks omitted):
We verify the correctness as follows:
If
e
is an expression let⟦ e ⟧
denote the set of possible valuese
can evaluate to over all choices of non-determinism which do not cause an assertion failure.Two lemmas claimed without proof:
Now let's show
We have
If
x
is a square thenmx
is not a square so we haveOn the other hand if
x
is not a square, thenmx
is a square so we havewhich evidently matches the claimed semantics.