Длинная арифметика на сях

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by winsock, 9 May 2011.

  1. winsock

    winsock New Member

    Joined:
    15 Aug 2010
    Messages:
    57
    Likes Received:
    2
    Reputations:
    0
    Решил немного размяться перед серьезным проектом)
    пара слов о релизации:

    числа представлены в виде следующей структурки:
    Code:
    typedef struct bigint_t {
            BI_DATA data[BI_MAX_ORDERS];
            BI_SIZE size;
    } BIGINT_T, *PBIGINT_T;
    
    bigendian (старший разряд справа)

    основание 0x10000. наверное идеальный вариант на 32 битных платформах.

    пример использования.
    Code:
    int _tmain(int argc, _TCHAR* argv[]) {
    	
    	BIGINT_T one_bigint = {{ 0xA123, 0xF11F, 0x1231 }, 3};
    	BIGINT_T two_bigint = {{ 0xFF12, 0xA234, 0x1}, 3};
    
    	BIGINT_T shl_result;
    	BIGINT_T shr_result;
    	BIGINT_T sum_result;
    	BIGINT_T sub_result;
    	BIGINT_T mul_result;
    	BIGINT_T div_result;
    	BIGINT_T div_b_result;
    	BIGINT_T mod_result;
    
    	printf("one_bigint   = ");
    	biprint(&one_bigint);
    	printf("\r\ntwo_bigint   = ");
    	biprint(&two_bigint);
    
    	printf("\r\nshr_bigint   = ");
    	bishr(&shr_result, &one_bigint, 2); 
    	biprint(&shr_result);
    	
    	printf("\r\nshl_bigint   = ");
    	bishl(&shl_result, &one_bigint, 3); 
    	biprint(&shl_result);
    
    	printf("\r\nbigint_add   = ");
    	biadd(&sum_result, &one_bigint, &two_bigint);
    	biprint(&sum_result);
    
    	printf("\r\nbigint_sub   = ");
    	bisub(&sub_result, &one_bigint, &two_bigint);
    	biprint(&sub_result);
    
    	printf("\r\nbigint_mul   = ");
    	bimul(&mul_result, &one_bigint, &two_bigint);
    	biprint(&mul_result);
    
    	
    	printf("\r\nbigint_div_b = ");
    	bidiv_b(&div_b_result, &one_bigint, 0xFF12);
    	biprint(&div_b_result);
    
    	printf("\r\nbigint_div   = ");
    	bidiv(&div_result, &one_bigint, &two_bigint);
    	biprint(&div_result);
    
    	printf("\r\nbigint_mod   = ");
    	bimod(&mod_result, &one_bigint, &two_bigint);
    	biprint(&mod_result);
    	
    	getchar();
    	return 0;
    }
    
    [​IMG]

    вроде "симпотично" получилось.

    Буду рад если кто нибудь что-нибудь подскажет или покритикует.

    Спасибо за внимание, надеюсь кому нибудь пригодится.:)

    P.S. особо не тестил, могут быть ошибки.

    source
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    самый лучший тест для длинной арифметики - шифрование / дешифрование RSA с длинными ключами. А также некоторые алгоритмы генерации ключей.

    там используются самый основные операции как раз.