Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
magrif
3 / 3 / 1
Регистрация: 01.11.2011
Сообщений: 162
1

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

24.02.2015, 23:56. Просмотров 1231. Ответов 7
Метки нет (Все метки)

Поставил криптографическую либу для Qt'а под названием QCA ради класса BigInteger, надеясь, что в нём реализованы операции с длинной арифметикой. Кроме +,-,*,/,% не нашел ни возведение в степень, ни получение обратного элемента, что мягко говоря огорчило.
Собственно вопрос(ы): может я эти операции где-то упустил из виду? или всё же их нету и надо реализовывать их? если да, то как? есть ли либы для Qt для работы с длинной арифметикой?
На сайте покопался, нашел, что возведение в степень реализовывается как http://www.cyberforum.ru/cgi-bin/latex.cgi?{a}^{b}={e}^{b*lna}. наговнокодил с использованием преобразований Тейлора:
говнокод

C++ (Qt)
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//возведение в степень больших чисел
void MainWindow::_pow(BigInteger x, BigInteger y)
{
    BigInteger tmp;
    tmp = _ln(x);
    tmp *= y;
    qDebug() << _exp(tmp).toString();
}
//возведение в натуральную степень
BigInteger MainWindow::_pow_int(BigInteger b, int i)
{
    if(i==0) return 1;
    BigInteger res(1);
    for(int k(1); k<=i ; k++)
        res *= b;
    return res;
}
//факториал
BigInteger MainWindow::_fact(int a)
{
    BigInteger res(1);
    for ( ; a > 1 ; res*=a--);
    return res;
}
//натуральный логарифм
BigInteger MainWindow::_ln(BigInteger b)
{
    b -= 1;
    qDebug() << "b" << b.toString();
    BigInteger res(0), tmp(0);
    for(int i(1) ; i<=50 ; i++)
    {
        tmp = _pow_int(b,i);
        tmp /= _fact(i);
        tmp *= _pow_int(-1, i+1);
        res += tmp;
        qDebug() << "tmp" << tmp.toString() << "res" << res.toString();
    }
    return res;
}
//экспонента
BigInteger MainWindow::_exp(BigInteger b)
{
    BigInteger sum(1), tmp(0);
    for(int i(1); i<=50 ; ++i)
    {
        tmp += _pow_int(b,i);
        tmp /= _fact(i);
        sum += tmp;
    }
    return sum;
}


Натуральный логарифм вообще криво считает, экспонента с погрешностью. Как быть с плавающей точкой для максимальной точности?
Пасибо...
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2015, 23:56
Ответы с готовыми решениями:

Qt QCA работает с тормозами на windows 8
Уважаемые форумчане, столкнулся с такой проблемой: есть программа по шифрованию...

QCA (Qt Cryptographic Architecture) + Qt 4.8.6. Установка под Windows
Собственно как это сделать. Туториалы только для Linux. Скачал qca-2.1.0 с их...

Длинная текстовая переменная
Подскажите какой текстовый тип в Qt самый длинный? Мне нужно уместить в нём...

QTableview, длинная строка в ячейке, многоточие
Добрый день. Интересует вопрос. Есть ли способ получить информацию,...

Арифметика вещественных шестнадцатиричных чисел
Здрасте. Подскажите пожалуйста. Как в qt creator сделать так, чтобы считались...

7
Avazart
Эксперт С++
7759 / 5664 / 555
Регистрация: 10.12.2010
Сообщений: 25,668
Записей в блоге: 17
25.02.2015, 19:20 2
Я gmp использовал для реализации rsa

Использование библиотеки gmp на примере вычисления числа пи
0
magrif
3 / 3 / 1
Регистрация: 01.11.2011
Сообщений: 162
25.02.2015, 21:27  [ТС] 3
подключил уже. Но как сделать взаимодействие типов библиотеки gmp и виджетов Qt? (вывести например полученное значение типа mpf_t в виджете QTextEdit).
0
Avazart
Эксперт С++
7759 / 5664 / 555
Регистрация: 10.12.2010
Сообщений: 25,668
Записей в блоге: 17
25.02.2015, 22:11 4
Переводя в char* cтроки.

Добавлено через 25 минут
так кажется есть что-то типа sprint.

А вот нашел с проекта выдрал (правда сам проект в C++Builder)
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
36
//---------------------- GMP ------------------------------------------------
#include <stdio.h>
#include "gmp.h"
#pragma comment(lib, "gmp-bcb.lib")
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
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);
    // print to C-string
    char buf[1000]={0};                     //    buf size !!!
    gmp_sprintf(buf,"%Zx\0", data);
  // clear
    mpz_clear(data);
    mpz_clear(mod);
    mpz_clear(exp);
 
return buf;
}


В принципе так документация нормальная, так что смотрите в нее.
1
magrif
3 / 3 / 1
Регистрация: 01.11.2011
Сообщений: 162
25.02.2015, 22:51  [ТС] 5
Цитата Сообщение от Avazart Посмотреть сообщение
mpz_init_set_str(mod,smod.c_str(),16);
* * mpz_init_set_str(exp,sexp.c_str(),16);
Цитата Сообщение от Avazart Посмотреть сообщение
mpz_init_set_str(data,sdata.c_str(),2);
Почему mod и exp представляются в hex, а data в bin системе исчисления?

Цитата Сообщение от Avazart Посмотреть сообщение
size_t keysize = (bitlength+7)>>3;
Почему именно так размер ключа рассчитывается?

Цитата Сообщение от Avazart Посмотреть сообщение
"%Zx\0"
Не могли бы Вы показать, где почитать про флаги функции gmp_sprintf, не нашел с разбегу сразу.
0
Avazart
Эксперт С++
7759 / 5664 / 555
Регистрация: 10.12.2010
Сообщений: 25,668
Записей в блоге: 17
25.02.2015, 23:30 6
Спросите что нибудь по проще, я давно это писал и там не обычный rsa как я помню.
Цитата Сообщение от magrif Посмотреть сообщение
Не могли бы Вы показать, где почитать про флаги функции gmp_sprintf, не нашел с разбегу сразу.
В документации.

Добавлено через 33 минуты
Кстати есть еще плюсовая обвертка над gmp - mpir она удобнее.
0
magrif
3 / 3 / 1
Регистрация: 01.11.2011
Сообщений: 162
26.02.2015, 00:11  [ТС] 7
а что скажете на счёт crypto++?
0
Avazart
Эксперт С++
7759 / 5664 / 555
Регистрация: 10.12.2010
Сообщений: 25,668
Записей в блоге: 17
26.02.2015, 01:41 8
Ничего, не использовал.
0
26.02.2015, 01:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2015, 01:41

Вычисление выражений. Арифметика (+ - * /). С числами и переменными A-D
это тема моего курсовика, в qt работаем с начала семестра, не сильно шарю. У...

Длинная Арифметика
Знаю в Jave было можно реализовать Длинную арифметику, а как в С# c=a+b; если...

Длинная арифметика
Вот условие задачи: Во время исследований, посвященных появлению жизни на...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru