c++ - 精确的大有限域线性代数库(例如 GF(2^128)/GF(2^256) )

标签 c++ math linear-algebra computer-algebra-systems finite-field

一般

我正在寻找一个能够对大型有限域进行精确计算的库,例如 GF(2128)/𝔽2128 和 GF(2256)/𝔽2256。我在下面列出了我需要的功能以及很酷的功能。显然,图书馆应该尽可能快:-)。啊,因为我不是 C++ 大师(可能大多数库都是 C++),所以示例代码说 生成一个随机元素/一个常数并将其乘以它的乘法逆

必备功能

  • 添加字段元素
  • 字段元素的乘法
  • 求字段元素的乘法逆元

很高兴拥有功能

  • vector/矩阵支持
  • 随机元素支持

我已经看过的库可能不会工作

  • FFLAS/FFPACK ,似乎不适用于如此大的有限域
  • Givaro ,似乎不适用于如此大的有限域

我已经看过的库可以工作(但我无法使用)

  • NTL ,我无法反转元素,但它应该真的可以工作,因为 SAGE在定义 GF(2^256) 时似乎使用了这个库,并且可以使用 x^(-1)
  • 反转一个元素
  • PARI/GP ,我无法在文档中找到我需要的所有内容,但 SAGE 文档有点说它应该可以工作

其他说明

  • 我正在编写一个 Haskell 程序,稍后将与该库进行接口(interface),因此更简单的 Haskell 接口(interface)会更好:-)

最佳答案

NTL 库似乎可以工作,使用这个(对不起,我无法用 C++ 编程)代码

#include <NTL/GF2E.h>
#include <NTL/GF2EX.h>
#include <NTL/GF2X.h>
#include <NTL/GF2XFactoring.h>

NTL_CLIENT

int main()
{
    GF2X P = BuildIrred_GF2X(256);
    GF2E::init(P);

    GF2E zero = GF2E::zero();
    GF2E one;
    GF2E r = random_GF2E();
    GF2E r2 = random_GF2E();
    conv(one, 1L);
    cout << "Cardinality: " << GF2E::cardinality() << endl;
    cout << "ZERO: " << zero << " --> " << IsZero(zero) << endl;
    cout << "ONE:  " << one  << " --> " << IsOne(one)   << endl;
    cout << "1/r:  " << 1/r  << ", r * (1/r): " << (r * (1/r)) << endl;
    cout << "1/r2:  " << 1/r2  << ", r2 * (1/r2): " << (r2 * (1/r2)) << endl;
}

它似乎有效,证明(这个程序的输出):

Cardinality: 115792089237316195423570985008687907853269984665640564039457584007913129639936
ZERO: [] --> 1
ONE:  [1] --> 1
1/r:  [0 1 0 1 1 0 1 1 1 0 1 1 1 0 0 1 1 0 1 1 1 0 1 1 0 0 0 0 0 1 0 1 0 1 1 0 1 1 0 0 0 0 0 0 1 1 1 0 1 1 1 0 1 0 1 0 0 0 1 1 1 0 1 1 1 1 0 1 0 1 0 1 1 0 1 1 1 0 0 0 1 0 0 1 0 1 1 1 0 1 1 0 1 1 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 1 0 1 1 1 1 0 0 1 1 0 1 0 1 1 1 1 1 1 0 1 1 0 0 0 0 0 1 1 0 1 0 0 1 1 1 0 1 1 1 1 1 0 1 0 1 0 0 0 1 1 0 0 1 1 0 0 1 0 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 0 1 0 0 0 0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 0 1 0 1 0 0 1 1 0 1 1 0 1 1 1 1 1 0 0 1 1 0 1 0 1 0 0 0 0 1 1 0 0 1 1 1 0 1], r * (1/r): [1]
1/r2:  [1 0 1 1 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0 1 1 1 0 0 0 1 1 1 1 1 0 1 0 1 1 0 0 1 1 1 0 1 0 1 0 0 1 0 0 0 0 1 1 1 0 0 0 1 1 1 1 1 0 0 1 0 0 0 1 1 0 1 0 1 1 1 0 0 1 0 1 0 1 0 0 1 0 0 0 1 0 0 1 1 1 1 1 0 0 0 0 1 1 1 0 1 0 1 0 1 0 0 0 1 0 1 0 1 1 0 0 0 1 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 1 1 1 0 1 1 0 0 0 0 1 1 0 1 1 1 0 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 1 1 1 1 0 1 0 1 1 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 1 0 1 1 1 0 1 0 0 0 0 1 0 1 1 0 0 0 1 1 0 0 1 1 0 1 0 0 1 0 1 0 0 1 1], r2 * (1/r2): [1]

即使反转似乎也可以工作(在上面的输出示例中尽可能向右滚动):-)

关于c++ - 精确的大有限域线性代数库(例如 GF(2^128)/GF(2^256) ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12041093/

相关文章:

javascript - 从 x,y 屏幕空间坐标查找 2D 等距网格上的列、行(将方程转换为函数)

c++ - 支持长 double 的最喜欢/最佳 A.X=B 求解器?

c++ - 模数中的线性组合 C++

c++ - Linux 守护进程 - 运行函数两次

php - 如何确定一个字符串是否是 PHP 中的数学语句?

c++ - 选择性隐式转换

java - 与圆的弹性碰撞

C++ - 矩阵减法

c++ - keyPressEvent() 没有捕获 OSX 上的某些键

c++ - 树的递归和非递归过程