如何使用GMP计算2 ^ -18?

时间:2009-01-07 03:10:42

标签: c gmp

我刚刚发现,令我尴尬的是,向mpz_pow_ui提供负面指数并不能很好地发挥作用。 (“手册确实说无符号长,你知道。”)对于其他mpz_pow函数,手册使用了我不理解的概念。例如,“ base ^ exp mod mod ”如下:

void mpz_powm (mpz_t rop, mpz_t base, mpz_t exp, mpz_t mod) 
void mpz_powm_ui (mpz_t rop, mpz_t base, unsigned long int exp, mpz_t mod)
Set _rop_ to _base_^_exp_ mod _mod_.
Negative exp is supported if an inverse base-1 mod mod exists (see mpz_invert in Section 5.9 [Number Theoretic Functions], page 35). If an inverse doesn’t exist then a divide by zero is raised.

在下面的代码中,我需要更改哪些内容才能处理负指数?

#define Z(x) mpz_t x; mpz_init( x );

BSTR __stdcall IBIGPOWER(BSTR p1, long p2 ) {
    USES_CONVERSION;

    Z(n1);
    Z(res);

    LPSTR sNum1 = W2A( p1 );

    mpz_set_str( n1, sNum1, 10 );

    mpz_pow_ui( res, n1, p2 );

    char * buff =  (char *) _alloca( mpz_sizeinbase( res, 10 ) + 2 );

    mpz_get_str(buff, 10, res);

    BSTR bResult = _com_util::ConvertStringToBSTR( buff );
    return bResult;
}

5 个答案:

答案 0 :(得分:9)

我不会为你剪掉代码,但我会告诉你:

2-n = 1/2n

所以你可以传递正指数然后将1除以该数字(并选择像mpf_t这样的非整数类型 - mpz_t类型是整数,所以不能代表像{{1这样的实数}})。

答案 1 :(得分:7)

mpz_t数据类型只能存储整数,而2 -18 不是整数。要计算,您必须使用浮点类型mpf_t或有理数字类型mpq_t

答案 2 :(得分:2)

我对GMP知之甚少,但是:

2 ^ -18

相当于:

1 / (2 ^ 18)

那么为什么不写一个以这种方式处理负指数的函数呢?

答案 3 :(得分:1)

  

如果是,则支持负exp   存在inverse base-1 mod mod(参见   第5.9节中的mpz_invert [编号   理论函数],第35页)。如果   逆不存在然后除以   零被提出。

如果你在谈论这个,那就涉及数论。划分,或更准确地说是乘法的逆,只存在于某些条件下。我不完全记得规则,但基本上它说如果 base-1 mod mod 不存在,除法操作将不起作用。

答案 4 :(得分:0)

您需要做什么取决于您希望在操作中丢失的位发生什么。既然你正在处理整数,那么提升到负权力意味着分裂(好吧,往复),但GMP提供了几种形式的division