Finite Fields
Basic FiniteField Term Builders
- cvc5.pythonic. FiniteFieldElem ( name , ff , ctx = None )
-
Return a finite field constant named name . ff may be the number of bits of a finite field sort. If ctx=None , then the global context is used.
>>> x = FiniteFieldElem('x', 17) >>> is_ff(x) True >>> x.size() 17 >>> x.sort() FiniteField(17) >>> word = FiniteFieldSort(17) >>> x2 = FiniteFieldElem('x', word) >>> eq(x, x2) True
- cvc5.pythonic. FiniteFieldVal ( val , ff , ctx = None )
-
Return a finite field value with the given number of bits. If ctx=None , then the global context is used. The second argument can be a number of bits (integer) or a finite field sort.
>>> v = FiniteFieldVal(10, 29) >>> v 10 >>> print("0x%.8x" % v.as_long()) 0x0000000a >>> s = FiniteFieldSort(3) >>> u = FiniteFieldVal(10, s) >>> u 1
- cvc5.pythonic. FiniteFieldSort ( sz , ctx = None )
-
Return an SMT finite field sort of the given size. If ctx=None , then the global context is used.
>>> f7 = FiniteFieldSort(7) >>> f7 FiniteField(7) >>> x = Const('x', f7) >>> eq(x, FiniteFieldElem('x', 7)) True
- cvc5.pythonic. FiniteFieldElems ( names , ff , ctx = None )
-
Return a tuple of finite field constants of size ff.
>>> x, y, z = FiniteFieldElems('x y z', 17) >>> x.size() 17 >>> x.sort() FiniteField(17) >>> Sum(x, y, z) x + y + z >>> Product(x, y, z) x*y*z
Arithmetic Overloads
See the following operator overloads for building finite field terms. These terms can also be built with builder functions listed below.
-
addition (
+
) -
subtraction (
-
) -
negation (
-
) -
multiplication (
*
) -
equality (
==
)
- cvc5.pythonic. FFAdd ( * args )
-
Create a sum of finite fields.
See also the __add__ overload (+ operator) for FiniteFieldRef.
>>> x, y, z = FiniteFieldElems('x y z', 29) >>> FFAdd(x, y, z) x + y + z
- cvc5.pythonic. FFSub ( a , b )
-
Create a difference of finite fields.
See also the __sub__ overload (- operator) for FiniteFieldRef.
>>> x, y = FiniteFieldElems('x y', 29) >>> FFSub(x, y) x + -y
- cvc5.pythonic. FFNeg ( a )
-
Create a negation of a finite field elemetn
See also the __neg__ overload (unary - operator) for FiniteFieldRef.
>>> x = FiniteFieldElem('x', 29) >>> FFNeg(x) -x
- cvc5.pythonic. FFMult ( * args )
-
Create a product of finite fields.
See also the __mul__ overload (* operator) for FiniteFieldRef.
>>> x, y, z = FiniteFieldElems('x y z', 29) >>> FFMult(x, y, z) x*y*z
Testers
- cvc5.pythonic. is_ff_sort ( s )
-
Return True if s is an SMT finite field sort.
>>> is_ff_sort(FiniteFieldSort(29)) True >>> is_ff_sort(IntSort()) False
- cvc5.pythonic. is_ff ( a )
-
Return True if a is an SMT finite field expression.
>>> b = FiniteFieldElem('b', 29) >>> is_ff(b) True >>> is_ff(b + 10) True >>> is_ff(Int('x')) False
- cvc5.pythonic. is_ff_value ( a )
-
Return True if a is an SMT finite field numeral value.
>>> b = FiniteFieldElem('b', 29) >>> is_ff_value(b) False >>> b = FiniteFieldVal(10, 29) >>> b 10 >>> is_ff_value(b) True
Classes (with overloads)
- class cvc5.pythonic. FiniteFieldSortRef ( ast , ctx = None )
-
Bit-vector sort.
- cast ( val )
-
Try to cast val as a finite field
>>> b = FiniteFieldSort(31) >>> b.cast(10) 10 >>> b.cast(10).sexpr() '#f10m31'
- size ( )
-
Return the size (number of elements) of the finite field sort self .
>>> b = FiniteFieldSort(17) >>> b.size() 17
- class cvc5.pythonic. FiniteFieldRef ( ast , ctx = None , reverse_children = False )
-
Bit-vector expressions.
- __add__ ( other )
-
Create the SMT expression self + other .
>>> x = FiniteFieldElem('x', 29) >>> y = FiniteFieldElem('y', 29) >>> x + y x + y >>> (x + y).sort() FiniteField(29)
- __mul__ ( other )
-
Create the SMT expression self * other .
>>> x = FiniteFieldElem('x', 29) >>> y = FiniteFieldElem('y', 29) >>> x * y x*y >>> (x * y).sort() FiniteField(29)
- __neg__ ( )
-
Return an expression representing -self .
>>> x = FiniteFieldElem('x', 29) >>> -x -x >>> solve([-(-x) != x]) no solution
- __pos__ ( )
-
Return self .
>>> x = FiniteFieldElem('x', 29) >>> +x x
- __radd__ ( other )
-
Create the SMT expression other + self .
>>> x = FiniteFieldElem('x', 29) >>> 10 + x 10 + x
- __rmul__ ( other )
-
Create the SMT expression other * self .
>>> x = FiniteFieldElem('x', 29) >>> 10 * x 10*x
- __rsub__ ( other )
-
Create the SMT expression other - self .
>>> x = FiniteFieldElem('x', 29) >>> 10 - x 10 + -x >>> 10 + -x 10 + -x
- __sub__ ( other )
-
Create the SMT expression self - other .
>>> x = FiniteFieldElem('x', 29) >>> y = FiniteFieldElem('y', 29) >>> x - y x + -y >>> (x - y).sort() FiniteField(29)
- size ( )
-
Return the number of bits of the finite field expression self .
>>> x = FiniteFieldElem('x', 29) >>> (x + 1).size() 29
- sort ( )
-
Return the sort of the finite field expression self .
>>> x = FiniteFieldElem('x', 29) >>> x.sort() FiniteField(29) >>> x.sort() == FiniteFieldSort(29) True
- class cvc5.pythonic. FiniteFieldNumRef ( ast , ctx = None , reverse_children = False )
-
Bit-vector values.
- as_long ( )
-
Return an SMT finite field numeral as a positive Python long (bignum) numeral.
>>> v = FiniteFieldVal(28, 29) >>> v -1 >>> v.as_long() 28
- as_signed_long ( )
-
Return an SMT finite field numeral as a Python long (bignum) numeral.
Returns the numeral of minimum absolute value, so the additive inverse of 1 is “-1”.
>>> FiniteFieldVal(4, 3).as_signed_long() 1 >>> FiniteFieldVal(7, 3).as_signed_long() 1 >>> FiniteFieldVal(3, 3).as_signed_long() 0 >>> FiniteFieldVal(28, 29).as_signed_long() -1