biginteger на Objective-c

Кто-нибудь может предоставить код для реализации BigInteger в Objective-C, который предоставляет функцию PowMod?


person Community    schedule 04.08.2009    source источник


Ответы (5)


Надеюсь, еще не поздно ответить в этой теме.

Вы можете попробовать "LibTomMath", которая является бесплатной и с открытым исходным кодом (автор передает этот проект как общественное достояние). Он работает из коробки без какой-либо настройки, просто поместите все bn_*.c и tommath*.h в свой проект Xcode, и вы готовы к работе.

#import "tommath.h"

mp_int number1, number2, number3;

mp_init(&number1);
mp_init(&number2);
mp_init(&number3);

mp_read_radix(&number1, "0a120edfff558c98a73015d5d67e8990", 16);
mp_read_radix(&number2, "12e6f45d698c7b7009a841c1348d6ff4", 16);

mp_mul(&number1, &number2, &number3);

char output[1000];
mp_toradix(&number3, output, 16);
NSLog(@"number3:%s", output);

mp_div(&number3, &number1, &number2, NULL);
mp_toradix(&number2, output, 16);
NSLog(@"number2:%s", output);
person iwat    schedule 11.12.2009
comment
В TomMath нет функции pow(), она может возводить в квадрат или квадратный корень, но если вы хотите возвести в степень n, это не так просто. - person Muskie; 02.02.2013
comment
Конечно, у него есть возведение в степень — функция называется mp_expt_d. - person dchest; 23.11.2016

Как простая библиотека C, BN openssl должен уметь это делать.

BN_mod_exp() вычисляет a в p-й степени по модулю m (r=a^p% m). Эта функция использует меньше времени и места, чем BN_exp().

person HerdplattenToni    schedule 04.08.2009

Вы можете попробовать https://github.com/kirsteins/JKBigInteger. Это похоже на BigInteger. У него есть методы mod и pow, которые вы можете комбинировать.

person Kirsteins    schedule 31.07.2013
comment
Работает отлично! Отличная библиотека третьей части! - person Gabriel.Massana; 13.12.2013
comment
Кажется, внутри используется LibTomMath (см. ответ iwat). - person LaborEtArs; 20.05.2016

Ближайший встроенный класс в библиотеках Cocoa — NSDecimalNumber , который обеспечивает арифметику с основанием 10 (и поэтому может обрабатывать только арифметические операции с целыми числами) для диапазона мантисса x 10^экспонента, где мантисса — это 38-битное число с плавающей запятой, а экспонента — от -128 до 128. Если это покрывает диапазон, который вы нужно, есть методы умножения и мощности. В противном случае, поскольку Objective-C является надмножеством C, подойдет любая реализация bigint на языке C, которую вы сможете найти.

person Barry Wark    schedule 04.08.2009
comment
Это почти наверняка не то, что ищет автор. NSDecimalNumber использует систему счисления с основанием 10 для кодирования и манипулирования числами, а не (намного) более распространенную систему счисления с основанием 2. Система счисления с основанием 10 обычно используется всякий раз, когда речь идет о валюте. На самом деле, в зависимости от вашей юрисдикции, обработка чисел, связанных с валютой, в системах счисления, отличных от 10, может быть незаконной. - person johne; 05.08.2009

Однажды, давным-давно, я обернул свою собственную обертку вокруг GMP. Я никогда раньше не пользовался никакими сторонними библиотеками BigNum ObjC, но я добавил в закладки эти: RSMath, который использует функции OpenSSL bignum, и MPInteger, который использует GMP.

person johne    schedule 04.08.2009