如何使用MPIR库计算GCD

时间:2013-01-02 01:18:54

标签: c++ visual-c++ gmp

我在使用算术库方面相对缺乏经验。我需要尝试使用MPIR库中的一个函数编写一些计算最大公分母的代码。我发现了几种方法,我不明白他们定义变量的方式。例如:关于:

void mpz_gcd (mpz_t rop, mpz_t op1, mpz_t op2) 

我无法理解变量类型以及如何使用它们。任何人都可以向我提供一些简单的代码,向我说明这一点吗?

1 个答案:

答案 0 :(得分:2)

  

但无法理解变量类型。

如果它是你所关注的变量 types ,那么mpz只是任意精度整数(而不是实数)。

就变量本身而言,rop是返回变量,即将设置为op1op2的GCD的变量。

例如,这是一个完整的程序,用于说明该功能的使用:

#include <stdio.h>
#include <mpir.h>

int main (void) {
    mpz_t a, b, c;
    mpz_init (a); mpz_init (b); mpz_init (c);

    mpz_set_str (a, "1024", 10);
    mpz_set_str (b, "768", 10);
    mpz_gcd (c, a, b);

    printf ("GCD of "); mpz_out_str (stdout, 10, a);
    printf (" and ");   mpz_out_str (stdout, 10, b);
    printf (" is ");    mpz_out_str (stdout, 10, c);
    putchar ('\n');

    return 0;
}

输出结果为:

GCD of 1024 and 768 is 256

  

我想生成长位的随机值。

然而,如果(正如你在评论中提到的那样,虽然很难看出GCD计算的适用性)你想要一个100位的随机数,你可以使用类似的东西:

#include <stdio.h>
#include <time.h>
#include <mpir.h>

int main (void) {
    mpz_t a;
    gmp_randstate_t rstate;

    mpz_init (a);
    gmp_randinit_default (rstate);
    gmp_randseed_ui (rstate, time (0));

    mpz_urandomb (a, rstate, 100);
    printf ("100 random bits gives: "); mpz_out_str (stdout, 10, a);
    putchar ('\n');

    return 0;
}