13#include <llvm/ADT/APSInt.h>
14#include <llvm/ADT/SlowDynamicAPInt.h>
15#include <llvm/ADT/Twine.h>
24 APSInt parsedInt(primeStr);
27 halfPrime = (primeMod +
felt(1)) /
felt(2);
28 bitwidth = parsedInt.getBitWidth();
32 static DenseMap<StringRef, Field> knownFields;
33 static std::once_flag fieldsInit;
34 std::call_once(fieldsInit, initKnownFields, knownFields);
36 if (
auto it = knownFields.find(fieldName); it != knownFields.end()) {
39 report_fatal_error(
"field \"" + Twine(fieldName) +
"\" is unsupported");
42void Field::initKnownFields(DenseMap<StringRef, Field> &knownFields) {
44 knownFields.try_emplace(
46 Field(
"21888242871839275222246405745257275088696311157297823662689037894645226208583")
48 knownFields.try_emplace(
"bn254", knownFields.at(
"bn128"));
50 knownFields.try_emplace(
"babybear",
Field(
"2013265921"));
52 knownFields.try_emplace(
"goldilocks",
Field(
"18446744069414584321"));
54 knownFields.try_emplace(
"mersenne31",
Field(
"2147483647"));
58 DynamicAPInt m = i %
prime();
This file implements helper methods for constructing DynamicAPInts.
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 felt(int i) const
Returns i as a signed field element.
static const Field & getField(const char *fieldName)
Get a Field from a given field name string.
DynamicAPInt toDynamicAPInt(StringRef str)