当我尝试计算多项式时看到段错误。我做错了什么?

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

我正在尝试使用 FLINT Fast Library for Number Theory (https://flintlib.org/) 来评估整数 mod a prime 上的多元多项式

p
。我的代码似乎遵循文档,但仍然导致分段错误。

这是重现该问题的最小示例:

#include"flint/fmpz_mod_mpoly.h"

int main(){
   const char *x[4]={"d","m1","s","t"};
   fmpz *vals=(fmpz []){3,5,7,11};
   slong p=13,c=0;
   fmpz_mod_mpoly_ctx_t C;
   fmpz_mod_mpoly_t E;

   fmpz_mod_mpoly_ctx_init(C,4,ORD_LEX,&p);
   fmpz_mod_mpoly_init(E, C);

   fmpz_mod_mpoly_set_str_pretty(E,"-d",x,C);

   //this is the line that segfaults
   fmpz_mod_mpoly_evaluate_all_fmpz(&c,E,&vals,C);

   flint_printf("Solution is %wd\n",c);
   fmpz_mod_mpoly_clear(E,C);
   fmpz_mod_mpoly_ctx_clear(C);
   return 0;
}

分段错误发生在库中的函数内部,因此显然要么库本身存在错误,要么我使用不正确。我猜是后者。我做错了什么?

编辑:添加了注释来标识段错误发生在哪一行。我还在下面发布了调用堆栈:

Thread 0 Crashed::  Dispatch queue: com.apple.main-thread
0   libflint.19.0.dylib                 0x103747d05 fmpz_mod + 37
1   libflint.19.0.dylib                 0x103936dfc fmpz_mod_mpoly_evaluate_all_fmpz + 255
2   Ftest                               0x102640e98 main + 264
3   dyld                              0x7ff807368366 start + 1942
c flint
1个回答
0
投票

我怀疑您在这里看到的是使用 C 等弱类型语言的缺点。与 C++ 不同,您无法在 C 中轻松定义新的数学类型。

所以 FLINT 所做的就是定义两种类型,

fmpz
fmpz_t
。请注意细微差别,它们不是同一类型。特别是,根据文档,
fmpz_t
被定义为
fmpz[1]

这会导致各种有趣的转换,因为在 C++ 中,数组表达式可以转换为指向其第一个参数的指针。这给了你从

fmpz_t
fmpz*
的转换,这显然对 FLINT 的作者有吸引力,但对普通的 C 程序员则不然。这给我们带来了很大的困惑。

在这种情况下,如果我了解了文档,您应该会得到

fmpz_t vals[4]

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