FLINT lib:如何删除多项式

问题描述 投票:0回答:1

在库FLINT中,我们有函数fmpz_poly_clear可以从内存中清除fmpz_poly多项式。但我使用的是这个库的 C++ 接口,所以,我的多项式的类型为 fmpz_polyxxfmpz_mod_polyxx

我想知道如何清除这些多项式。我已经搜索过 FLINT 的文档,但什么也没找到。

例如,以下程序创建一个具有七百万个系数的多项式。在我的机器上,它使用大约 1GB 的 RAM。退出 for 循环后,我尝试删除多项式。

我正在读取一个整数,只是为了让程序在终止执行之前等待。

#include <iostream>
#include "flint/fmpzxx.h"
#include "flint/fmpz_mod_polyxx.h"
#include "flint/fmpz_mod_poly_factorxx.h"

using namespace flint;

int main(int argc, char *argv[])
{
    // q  (273-bit prime)
    fmpzxx q("15177100720513508366558296147058741458143803430094840009779784451085189728165691397");

    fmpz_mod_polyxx* myPoly = new fmpz_mod_polyxx(q); 
    for (int i = 0; i < 7000000; i++){
        myPoly->set_coeff(i, q - fmpzxx(i));
    }
    delete myPoly;             // <-- this line does not work
//  fmpz_poly_clear(myPoly);  // <-- this line does not work
//  fmpz_mod_polyxx_clear(myPoly); // <-- this one neither
    int a;
    std::cin >> a; // wait 
    return EXIT_SUCCESS;
}

有人知道怎么做吗?

c++ memory-management flint
1个回答
0
投票

使用

flint
处理多项式时,最好使用
fmpz_mod_poly_t
而不是
* fmpz_mod_poly
。类型
fmpz_mod_poly_t
被类型定义为长度为 1 的
fmpz_mod_poly_struct
数组,因此它的行为类似于指针,并允许通过引用传递
fmpz_mod_poly_struct
类型的参数。

(此模式在

flint
arb
calcium
以及同一系列中的其他库中均采用)。
init
clear
函数需要这些类型并且会适当地执行它。

例如,这个较小的代码初始化一个多项式,对其求平方,打印它,然后清除多项式和模数的内存。

#include "fmpz_mod_poly.h"
int main() {
  fmpz_t n;                // array of length 1 fmpz_struct
  fmpz_mod_poly_t x, y;    // array of length 1 fmpz_mod_poly_struct

  fmpz_init_set_ui(n, 7);  // n = 7
  fmpz_mod_poly_init(x, n);
  fmpz_mod_poly_init(y, n);
  fmpz_mod_poly_set_coeff_ui(x, 3, 5);
  fmpz_mod_poly_set_coeff_ui(x, 0, 6);
  fmpz_mod_poly_sqr(y, x);
  fmpz_mod_poly_print(x); flint_printf("\n");
  fmpz_mod_poly_print(y); flint_printf("\n");

  fmpz_mod_poly_clear(x); // clear x memory
  fmpz_mod_poly_clear(y); // clear y memory
  fmpz_clear(n);          // clear modulus memory
}

在内部,每个

fmpz_mod_poly_struct
由多个系数组成,每个系数都是一个
fmpz
整数。在创建和操作时,这些可能会被分配和更改。删除时,每一个都需要清除,这就是为什么简单地在
delete
上调用
*fmpz_mod_poly
不起作用。相反,这会导致内存泄漏。

© www.soinside.com 2019 - 2024. All rights reserved.