14#include <llvm/ADT/DenseMap.h>
15#include <llvm/ADT/DynamicAPInt.h>
16#include <llvm/Support/SMTAPI.h>
39 llvm::DynamicAPInt
prime()
const {
return primeMod; }
42 llvm::DynamicAPInt
half()
const {
return halfPrime; }
45 inline llvm::DynamicAPInt
felt(
int i)
const {
return reduce(i); }
48 inline llvm::DynamicAPInt
zero()
const {
return felt(0); }
51 inline llvm::DynamicAPInt
one()
const {
return felt(1); }
57 llvm::DynamicAPInt
inv(
const llvm::DynamicAPInt &i)
const;
59 llvm::DynamicAPInt
inv(
const llvm::APInt &i)
const;
64 llvm::DynamicAPInt
reduce(
const llvm::DynamicAPInt &i)
const;
65 inline llvm::DynamicAPInt
reduce(
int i)
const {
return reduce(llvm::DynamicAPInt(i)); }
66 llvm::DynamicAPInt
reduce(
const llvm::APInt &i)
const;
68 inline unsigned bitWidth()
const {
return bitwidth; }
71 llvm::SMTExprRef
createSymbol(llvm::SMTSolverRef solver,
const char *name)
const {
72 return solver->mkSymbol(name, solver->getBitvectorSort(
bitWidth()));
76 return lhs.primeMod == rhs.primeMod;
80 Field(std::string_view primeStr);
82 llvm::DynamicAPInt primeMod, halfPrime;
85 static void initKnownFields(llvm::DenseMap<llvm::StringRef, Field> &knownFields);
This file implements helper methods for constructing DynamicAPInts.
llvm::DynamicAPInt half() const
Returns p / 2.
llvm::SMTExprRef createSymbol(llvm::SMTSolverRef solver, const char *name) const
Create a SMT solver symbol with the current field's bitwidth.
friend bool operator==(const Field &lhs, const Field &rhs)
Field(const Field &)=default
llvm::DynamicAPInt zero() const
Returns 0 at the bitwidth of the field.
llvm::DynamicAPInt prime() const
For the prime field p, returns p.
llvm::DynamicAPInt reduce(const llvm::DynamicAPInt &i) const
Returns i mod p and reduces the result into the appropriate bitwidth.
llvm::DynamicAPInt one() const
Returns 1 at the bitwidth of the field.
llvm::DynamicAPInt reduce(int i) const
llvm::DynamicAPInt felt(int i) const
Returns i as a signed field element.
llvm::DynamicAPInt reduce(const llvm::APInt &i) const
llvm::DynamicAPInt inv(const llvm::DynamicAPInt &i) const
Returns the multiplicative inverse of i in prime field p.
unsigned bitWidth() const
static const Field & getField(const char *fieldName)
Get a Field from a given field name string.
Field(Field &&) noexcept=default
llvm::DynamicAPInt maxVal() const
Returns p - 1, which is the max value possible in a prime field described by p.