NTL
官网:https://libntl.org/doc/tour.html
NTL is a high-performance, portable C++ library providing data structures and algorithms for arbitrary length integers; for vectors, matrices, and polynomials over the integers and over finite fields; and for arbitrary precision floating point arithmetic.
NTL provides high quality implementations of state-of-the-art algorithms for:
- arbitrary length integer arithmetic and arbitrary precision floating point arithmetic;
- polynomial arithmetic over the integers and finite fields including basic arithmetic, polynomial factorization, irreducibility testing, computation of minimal polynomials, traces, norms, and more;
- lattice basis reduction, including very robust and fast implementations of Schnorr-Euchner, block Korkin-Zolotarev reduction, and the new Schnorr-Horner pruning heuristic for block Korkin-Zolotarev;
- basic linear algebra over the integers, finite fields, and arbitrary precision floating point numbers.
类型介绍
The basic ring classes are:
ZZ : big integersZZ_p : big integers modulo pzz_p : integers mod “single precision” pGF2 : integers mod 2ZZX : univariate polynomials over ZZZZ_pX : univariate polynomials over ZZ_pzz_pX : univariate polynomials over zz_pGF2X : polynomials over GF2ZZ_pE : ring/field extension over ZZ_pzz_pE : ring/field extension over zz_pGF2E : ring/field extension over GF2ZZ_pEX : univariate polynomials over ZZ_pEzz_pEX : univariate polynomials over zz_pEGF2EX : univariate polynomials over GF2E
使用
SetSeed(const ZZ& s) :设置PRF种子
RandomBnd(ZZ& x, const ZZ& n) :
x
∈
{
0
,
1
,
?
n
?
1
}
x \in \{0,1,\cdots n-1\}
x∈{0,1,?n?1},如果
n
≤
0
n \le 0
n≤0 那么
x
=
0
x=0
x=0
RandomBits(ZZ& x, long l) :随机生成
l
l
l比特的整数
ZZ p(17) :初始化整数为17,这里参数类型是long
p = to_ZZ("123") :读入字符串,可输入大整数
GenPrime(p, 8) :随机生成8比特素数
ZZ_p::init(p) :初始化环
Z
p
Z_p
Zp?
ZZ_p a(2) :初始化为
2
m
o
d
??
p
2 \mod p
2modp,这里参数类型是long
random(a) :随机生成
Z
p
Z_p
Zp?中元素
ZZ_pX m :
Z
p
[
x
]
Z_p[x]
Zp?[x]中的多项式,记录为向量
Z
p
n
Z_p^n
Zpn?
SetCoeff(m, 5) :将
x
5
x^5
x5系数置为 1
m[0]=1 :将
x
0
x^0
x0系数置为 1
BuildIrred(m, 3) :随机生成3次不可约多项式
ZZ_pE::init(m) :初始化环
Z
p
[
x
]
/
(
m
(
x
)
)
Z_p[x]/(m(x))
Zp?[x]/(m(x)),若
p
p
p是素数且
m
(
x
)
m(x)
m(x)是d次不可约多项式,那么它同构于有限域
G
F
(
p
d
)
GF(p^d)
GF(pd)
ZZ_pEX f, g, h :
G
F
(
p
d
)
[
x
]
GF(p^d)[x]
GF(pd)[x]上的多项式,记录为向量
G
F
(
p
d
)
n
GF(p^d)^n
GF(pd)n
random(f, 5) :随机生成5次多项式
h = sqr(g) % f :计算
h
≡
g
2
m
o
d
??
f
h \equiv g^2 \mod f
h≡g2modf
- 环
G
F
(
p
d
)
[
x
]
/
(
x
n
?
1
)
GF(p^d)[x]/(x^n-1)
GF(pd)[x]/(xn?1)上多项式运算:
#include <iostream>
#include <NTL/ZZ_p.h> // integers mod p
#include <NTL/ZZ_pX.h> // polynomials over ZZ_p
#include <NTL/ZZ_pE.h> // ring/field extension of ZZ_p
#include <NTL/ZZ_pEX.h> // polynomials over ZZ_pE
#include <NTL/ZZ_pXFactoring.h>
#include <NTL/ZZ_pEXFactoring.h>
using namespace std;
using namespace NTL;
#pragma comment(lib, "NTL")
int main()
{
ZZ p(17); //初始化为17
//群Z_p
ZZ_p::init(p);
//随机生成Z_p[x]中的d次不可约多项式
int d = 4;
ZZ_pX m;
BuildIrred(m, d);
//域GF(p^d) = Z_p[x]/m(x)
ZZ_pE::init(m);
//GF(p^d)[x]中的多项式
ZZ_pEX f, g, h;
// f(x) = x^8 - 1
SetCoeff(f, 8); //将 x^8 系数置为 1
SetCoeff(f, 0, -1); //将 x^0 系数置为 -1
//随机生成5次多项式
random(g, 5);
// 环上多项式的运算:h = g^2 mod f
h = sqr(g) % f;
cout << "p = " << p << endl;
cout << "d = " << d << endl;
cout << "m(x) = " << m << endl;
cout << "f = " << f << endl;
cout << "g = " << g << endl;
cout << "h = " << h << endl;
return 0;
}
|