我正在尝试使用 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 等弱类型语言的缺点。与 C++ 不同,您无法在 C 中轻松定义新的数学类型。
所以 FLINT 所做的就是定义两种类型,
fmpz
和 fmpz_t
。请注意细微差别,它们不是同一类型。特别是,根据文档,fmpz_t
被定义为 fmpz[1]
。
这会导致各种有趣的转换,因为在 C++ 中,数组表达式可以转换为指向其第一个参数的指针。这给了你从
fmpz_t
到 fmpz*
的转换,这显然对 FLINT 的作者有吸引力,但对普通的 C 程序员则不然。这给我们带来了很大的困惑。
在这种情况下,如果我了解了文档,您应该会得到
fmpz_t vals[4]
。