Форум программистов, компьютерный форум CyberForum.ru

Длинная арифметика - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 104, средняя оценка - 4.82
Rolion
 Аватар для Rolion
14 / 14 / 3
Регистрация: 04.01.2011
Сообщений: 195
13.01.2012, 23:10     Длинная арифметика #1
Всем привет! Хотелось бы узнать -- есть ли в С++ библиотека, где реализованы операции над длинными числами?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2012, 23:10     Длинная арифметика
Посмотрите здесь:

Длинная арифметика C++
C++ Длинная арифметика
C++ Длинная арифметика
C++ Длинная арифметика
C++ Длинная арифметика
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mockingbird
8 / 8 / 1
Регистрация: 13.01.2012
Сообщений: 19
14.01.2012, 00:10     Длинная арифметика #2
Можно почитать соответствующую тему на этом же сайте:
http://www.cyberforum.ru/cpp-beginne...ead153284.html
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
14.01.2012, 00:41     Длинная арифметика #3
Есть обалденный класс, не мой, я там вносил правки, они все оговорены.
Вложения
Тип файла: rar VERYLONG.rar (4.0 Кб, 1425 просмотров)
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
14.01.2012, 10:29     Длинная арифметика #4
Цитата Сообщение от Rolion Посмотреть сообщение
Всем привет! Хотелось бы узнать -- есть ли в С++ библиотека, где реализованы операции над длинными числами?
gmp
Очень быстро работает, неплохая документация, есть варианты для С и для плюсов.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
14.01.2012, 10:49     Длинная арифметика #5
В стандартной библиотеке С++ вроде как нет. Предыдущие ответы говорят об этом.
KONK
0 / 0 / 0
Регистрация: 27.10.2012
Сообщений: 4
28.10.2012, 02:29     Длинная арифметика #6
Цитата Сообщение от kravam Посмотреть сообщение
Есть обалденный класс, не мой, я там вносил правки, они все оговорены.
Может объяснить как использовать класс. мне нужно просто посчитать большое число в большой степени и взять остаток от деления
C
1
2
3
4
5
6
7
8
9
10
  
int m=323;
int e =79;
char text;
        cout<<endl<<"Enter text:";
        cin>>text;
        cout<<"text in ASCII:"<<int(text)<<"\t";
        encrypt = myPow(int(text),e)%m;//вот здесь
        cout<<"Encrypted text:";
        printf("%u", encrypt);
нужно чтобы переменная encrypt была большим числом,
но я так понимаю нельзя просто написать
C
1
2
Verylong encrypt;
encrypt = myPow(int(text),e)%m;
и как его вывести в консоль, у меня получается только как строку puts(encrypt)? да и то не все знаки.
помогите разобраться.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
28.10.2012, 02:42     Длинная арифметика #7
gmp, (mpir ) и NTL

http://www.cyberforum.ru/blogs/131347/blog488.html
Библиотеки для работы с большими числами (длинная арифметика)

Добавлено через 6 минут
Как я понимаю надо сделать что-то вроде этого ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//---------------------- GMP ------------------------------------------------
#include <stdio.h>
#include "gmp.h"
#pragma comment(lib, "gmp-bcb.lib")
//---------------------------------------------------------------------------
std::string RSAencrypt(std::string sdata,std::string smod,std::string sexp)
{
    mpz_t data,mod,exp;
    //  init
    mpz_init(data);
    mpz_init(mod);
    mpz_init(exp);
    // set
    mpz_init_set_str(mod,smod.c_str(),16);
    mpz_init_set_str(exp,sexp.c_str(),16);
    //  amount bits in Mod
    size_t bitlength= 4*smod.size();
    size_t keysize = (bitlength+7)>>3;
    //    pkcs1pad2 function
    sdata= pkcs1pad2(sdata,keysize); //  дополнительная ф-ция
    //  data to BigInt
    mpz_init_set_str(data,sdata.c_str(),2);
    //  modPowInt
    mpz_powm(data,data,exp,mod);  /* <-   Pow и Mod    */
    // print to C-string
    char buf[1000];                     //    buf size !!!
    gmp_sprintf(buf,"%Zx\0", data);
  // clear
    mpz_clear(data);
    mpz_clear(mod);
    mpz_clear(exp);
 
return buf;
}
Код взят с этой темы Получить cookies из браузера
KONK
0 / 0 / 0
Регистрация: 27.10.2012
Сообщений: 4
28.10.2012, 03:27     Длинная арифметика #8
Цитата Сообщение от Avazart Посмотреть сообщение
gmp, (mpir ) и NTL

http://www.cyberforum.ru/blogs/131347/blog488.html
Библиотеки для работы с большими числами (длинная арифметика)

Добавлено через 6 минут
Как я понимаю надо сделать что-то вроде этого ?

Код взят с этой темы Получить cookies из браузера
Я еще не разу не использовала посторонние библиотеки и у меня не получается подключить эту библиотеку, как и Crypto++.
Посоветуйте пожалуйста что-нибудь предельно простое, у меня прожка всего на 30 строчек.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
28.10.2012, 08:33     Длинная арифметика #9
Цитата Сообщение от KONK Посмотреть сообщение
Посоветуйте пожалуйста что-нибудь предельно простое, у меня прожка всего на 30 строчек.
используй тот файл, что я дал.

C++
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <iostream>
#include "VERYLONG.H"
int main () {
 Verylong encrypt;
 encrypt= pow ("32", "786")% (Verylong)34;
 
 cout<< encrypt;
 getchar ();
 return 0;
}
...И да, имей ввиду, если напишешь нечто вроде
C++
1
encrypt= pow ("3245", "78656");
, то всё, ты встряла. Вычисления будут идти очень долго.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 17
28.10.2012, 13:12     Длинная арифметика #10
Я еще не разу не использовала посторонние библиотеки и у меня не получается подключить эту библиотеку, как и Crypto++.
Посоветуйте пожалуйста что-нибудь предельно простое, у меня прожка всего на 30 строчек.
Ну как бы это простое... эта библиотека уже есть в собранном виде только подключить...

Какая у Вас среда разработки, модам ?

И какой битности операционная система 32/64 ?
KONK
0 / 0 / 0
Регистрация: 27.10.2012
Сообщений: 4
29.10.2012, 02:44     Длинная арифметика #11
Спасибо большое! Вот простая программка расшифровки строки для RSA алгоритма с известными открытым ключом и модулем:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<iostream>
#include<time.h>
#include<math.h>
#include<stdio.h>
#include<string>
#include"VERYLONG.h"
using namespace std;
int p,q;//находятся с помощью разложения модуля на простые множители
int e=345;//Открытый ключ
int d; //Закрытый ключ
 
int main()
{
    srand(time(NULL));
    d = rand()%100;
    while((e*d)%((p-1)*(q-1)) != 1){//Число d вычисляется такое, что (e * d) % ((p-1)*(q-1)) = 1.
    d = rand()%1000;
    }
 
cout<<"Secret key: {"<<d<<","<<(p-1)*(q-1)<<"}"<<endl;
 
 
//расшифровка происходит по такой формуле x = (y ^ d) % m
 
Verylong decrypt [20] ;
    int mas[100];
 
    for(int i=0; i<=20;i++){
    cout<<"encrypted :\t";
    cin>>mas[i];
    decrypt[i]= pow(Verylong(mas[i]), Verylong(d))%Verylong(p*q);
    puts("decrypted:");
    printf ("%c\n",int(decrypt[i]));
    }
}
oks1d
4 / 1 / 0
Регистрация: 24.10.2013
Сообщений: 91
13.12.2013, 21:07     Длинная арифметика #12
При компиляции пишет ошибку как её исправить?
Ошибка 1 error C2679: бинарный ">>": не найден оператор, принимающий правый операнд типа "std::string" (или приемлемое преобразование отсутствует) c:\program files\microsoft visual studio 11.0\vc\include\verylong.h 695 1 ConsoleApplication39

Вот 694 и 695 строки из подключаемого верилонг

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
string temp_;
s >> temp_;
 
 
#include <stdio.h>
#include <iostream>
#include "VERYLONG.H"
#include <string>
#include <cstdlib>
using namespace std;
int main () {
 Verylong encrypt;
 encrypt= pow ("32", "786")% (Verylong)34;
 cout<< encrypt;
 system("pause");
 return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2013, 21:58     Длинная арифметика
Еще ссылки по теме:

Длинная арифметика C++
C++ Длинная арифметика

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
KONK
0 / 0 / 0
Регистрация: 27.10.2012
Сообщений: 4
13.12.2013, 21:58     Длинная арифметика #13
Цитата Сообщение от oks1d Посмотреть сообщение
При компиляции пишет ошибку как её исправить?
Ошибка 1 error C2679: бинарный ">>": не найден оператор, принимающий правый операнд типа "std::string" (или приемлемое преобразование отсутствует) c:\program files\microsoft visual studio 11.0\vc\include\verylong.h 695 1 ConsoleApplication39

Вот 694 и 695 строки из подключаемого верилонг

string temp_;
s >> temp_;
в файле verylong.h измени #include<string.h> на #include<string>
Yandex
Объявления
13.12.2013, 21:58     Длинная арифметика
Ответ Создать тему
Опции темы

Текущее время: 11:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru