c - 函数的 GMP mpz_t 返回类型
问题描述
我试图有一个递归函数,最终将返回一个 mpz_t 数据类型。我曾尝试使用来实现这一点,mpz_get_ui()
但这无法以非常大的数字(15 位数字+)给出正确的结果。该程序的目的是密码学。
我也尝试过创建 void 类型的函数并添加一个 mpz_t 参数,该参数充当这样的答案占位符:void fme(mpz_t y, mpz_t g, mpz_t x, mpz_t p)
但这消除了递归调用该函数的可能性,因为它不再返回任何内容。
我想知道是否可以使用 mpz_t 指针数据类型来做任何事情mpz_t*
?
这是我迄今为止所拥有的:
unsigned long int fme(mpz_t g, mpz_t x, mpz_t p) {
mpz_t result, temp;
mpz_init(result);
mpz_init(temp);
if (mpz_cmp_d(x, 0) == 0) {
mpz_clear(result);
mpz_clear(temp);
return 1;
} else if (mpz_even_p(x) != 0) {
mpz_fdiv_q_ui(temp, x, 2);
mpz_set_ui(result, fme(g, temp, p));
mpz_mul(result, result, result);
mpz_mod(result, result, p);
unsigned long int answer = mpz_get_ui(result);
mpz_clear(result);
mpz_clear(temp);
return answer;
}
解决方案
我认为只是:
// note: places result in the first argument, that has to initialized
void fme(mpz_t result, mpz_t g, mpz_t x, mpz_t p) {
if (mpz_cmp_d(x, 0) == 0) {
mpz_set_ui(result, 1);
return;
} else if (mpz_even_p(x) != 0) {
mpz_t temp;
mpz_init(temp);
mpz_fdiv_q_ui(temp, x, 2);
fme(result, g, temp, p);
mpz_clear(temp);
mpz_mul(result, result, result);
mpz_mod(result, result, p);
}
}
// should work the same as original
unsigned long int fme_old(mpz_t g, mpz_t x, mpz_t p) {
mpz_t result;
mpz_init(result);
fme(result, g, x, p);
unsigned long int ret = mpz_get_ui(result);
mpz_clear(result);
return ret;
}
推荐阅读
- python - 如何使用 python 处理我的研究数据?
- javascript - 如何正确地将仿射变换应用于使用有符号距离函数渲染的场景的顶点
- sql - 如何将我的查询结果显示为字符串的一部分?
- angular - 无法通过 Angular 模板上的 Codelyzer 禁用 tslint 规则
- meta - 什么组织创建或保管 HTML 元标记?
- selenium - windows10上IE11切换窗口时出错
- axon - Axon Token [IndexTrackingToken{globalIndex=2}] 类型错误
- c# - Windows Auth on MVC 5 asks to log in and denies valid user if I add filters
- javascript - Vue将响应数据重定向到vue对象
- c++ - 为什么这是一种未定义的行为?