如何在Objective-C中对非常大的数进行取幂?

gom*_*lon 7 math objective-c ios

在Objective-C中以编程方式计算一个8位数的结果到3位数的幂,我遇到了一些麻烦.

取这些数字,例如:16468920^258,这应该产生一个长度1862位的数字.


我天真地尝试过:

unsigned long long result = 1;
for (int i = 0; i < 258; i++)
    result *= 16468920;
Run Code Online (Sandbox Code Playgroud)

......但是result产出0.


然后我尝试了:

long double result = powl(16468920, 258);
Run Code Online (Sandbox Code Playgroud)

......但是result产出inf.


找到NSDecimal之后,我尝试了这个:

NSDecimal result;
NSDecimal number = [[NSDecimalNumber decimalNumberWithString:@"16468920"] decimalValue];
NSDecimalPower(&result, &number, 258, NSRoundPlain);
Run Code Online (Sandbox Code Playgroud)

......但result输出NaN,所以我试过:

NSDecimalNumber *number = [[NSDecimalNumber alloc] initWithInt:16468920];
NSDecimalNumber *result = [number decimalNumberByRaisingToPower:258];
Run Code Online (Sandbox Code Playgroud)

...但是这段代码提出了一个问题NSDecimalNumberOverflowException.


关于我应该去哪个方向的任何指示?

sjs*_*sjs 3

由于 Objective-C 是 C 的超集,因此您可以使用 C 库,例如BN

int BN_exp(BIGNUM *r, BIGNUM *a, BIGNUM *p, BN_CTX *ctx);

BN_exp() raises a to the p-th power and places the result in r ("r=a^p"). This
function is faster than repeated applications of BN_mul(). 
Run Code Online (Sandbox Code Playgroud)

例如,请参阅此处了解如何将 openssl 引入 iOS。