mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
35 lines
727 B
Python
35 lines
727 B
Python
from opcodes import SHL
|
|
from rule import Rule
|
|
from z3 import BitVec, If
|
|
|
|
"""
|
|
Checking conversion of exp(2, X) to shl(X, 1)
|
|
"""
|
|
|
|
rule = Rule()
|
|
n_bits = 256
|
|
|
|
# Proof of exp(2, X) = shl(X, 1) by induction:
|
|
#
|
|
# Base case: X = 0, exp(2, 0) = 1 = 1 = shl(0, 1)
|
|
# Inductive step: assuming exp(2, X) = shl(X, 1) for X <= N
|
|
# to prove: exp(2, N + 1) = shl(N + 1, 1)
|
|
#
|
|
# Notice that exp(2, N + 1) = 2 * exp(2, N) mod 2**256
|
|
# since exp(2, N) = shl(N, 1), it is enough to show that
|
|
# 2 * shl(N, 1) mod 2**256 = shl(N + 1, 1)
|
|
#
|
|
# Also note that N + 1 < 2**256
|
|
|
|
N = BitVec('N', n_bits)
|
|
inductive_step = 2 * SHL(N, 1)
|
|
|
|
rule.check(
|
|
inductive_step,
|
|
If(
|
|
N == 2**256 - 1,
|
|
0,
|
|
SHL(N + 1, 1)
|
|
)
|
|
)
|