- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
#include <deque>
#include <stdint.h>
#include <iterator>
#include <algorithm>
#include <iostream>
#include <iomanip>
using namespace std;
typedef uint32_t bt;
typedef uint64_t dbt;
typedef deque<bt> bn;
#define cat2(b,e) b##e
#define cat(b,e) cat2(b,e)
#define fsi(i,s,e) for(size_t i(s), cat(i,_end)(e); i<cat(i,_end); ++(i))
#define fe(i,c) for(auto i((c).begin()), cat(i,_end)((c).end()); i!=cat(i,_end); ++(i))
void ml10(bn& n){
n.push_front(0);
}
uint32_t ni(const bn& n, size_t i){
if(n.size()<=i)
return 0;
else
return n[i];
}
size_t ms(const bn& n1, const bn& n2){
return (max) (n1.size(), n2.size());
}
bt gr(dbt tr){
return tr & (numeric_limits<bt>::max)();
}
bt gc(dbt tr){
return (tr & (~((dbt)(numeric_limits<bt>::max)()))) >> (numeric_limits<bt>::digits);
}
void pb(bt b1, bt b2, bt lc, bt& r, bt& c){
dbt tr = ((uint64_t)b1 + b2 + lc);
r = gr(tr);
c = gc(tr);
}
void mb(bt b1, bt b2, bt lc, bt& r, bt& c){
dbt tr = ((uint64_t)b1 * b2 + lc);
r = gr(tr);
c = gc(tr);
}
bn /*constexpr*/ bi(bn n){
reverse(n.begin(), n.end());
return n;
}
bn pl(const bn& n1, const bn& n2){
bn r;
bt c=0,br=0;
size_t ms_ = ms(n1, n2);
//r.reserve(ms_+1);
fsi(i,0,ms_){
pb(ni(n1,i),ni(n2,i),c,br,c);
r.push_back(br);
}
if (c)
r.push_back(c);
return r;
}
bn ml(bn n1, const bn& n2){
bn lr, r;
bt c=0;
//r.reserve(n1.size() + n2.size() + 1);
fsi(i2,0,n2.size()){
fsi(i1, 0, n1.size()){
lr.emplace_back();
mb(n1[i1], n2[i2], c, lr[i1], c);
}
if (c){
lr.push_back(c);
c = 0;
}
r = pl(r, lr);
lr.clear();
ml10(n1);
}
return r;
}
#define STR1(x) #x
#define STR(x) STR1(x)
#define EXPECT_TRUE(expr)\
do{\
if(!(expr))\
cout<<"*****Failed test: \"" STR(expr) "\"" << endl;\
else\
cout << "Test OK: \"" STR(expr) "\"" << endl;\
}while(false)
#define TEST(expr)\
do{\
cout << "Test begined: \"" STR(expr) "\"" << endl;\
(void)(expr);\
} while (false)
И вот мой просмотр аниме закончен.
http://ideone.com/eRJ7FA
main смотри в коментах
LispGovno 24.11.2014 01:25 # +1
В целом я проникся стилем
Fike 24.11.2014 04:34 # +6
gost 24.11.2014 07:57 # +5
bormand 24.11.2014 06:26 # +3
LispGovno 24.11.2014 09:48 # 0
В этом стиле есть что-то от хачкеля. Обычный непромышленный стиль.
Я тут в столбик перемножаю. Получился O(n^2). Надеюсь Тарас не кинет в меня камень.
А если бы я перемножал сложением. Сначало число плюс число. Затем 2 числа +2 числа. Затем 4 числа + 4 числа и тд... Получилось бы O(n log m), где n - число разрядов в числе, а m само число. Интересно что росло бы быстрее. Ой. Глупость спросил. Все очевидно...
roman-kashitsyn 24.11.2014 09:49 # 0
DFT
LispGovno 24.11.2014 09:53 # 0
Density functional theory?
De Financiële Telegraaf | Financieel nieuws leest u op DFT.nl?
Department for Transport - GOV.UK?
roman-kashitsyn 24.11.2014 09:56 # 0
LispGovno 24.11.2014 09:59 # 0
bormand 24.11.2014 10:32 # +1
Но ведь ГК читать она тебе не мешает...
LispGovno 24.11.2014 12:12 # +2
bormand 24.11.2014 13:35 # +1
bormand 24.11.2014 10:31 # 0
Тогда уж какого-нибудь монтгомери, если много умножений подряд. А вообще - я ленивый распиздяй, и юзаю гмп.
LispGovno 24.11.2014 12:14 # 0
кстати мне тут намекнули что юзать библиотеки общего назначения типа gmp не секьюрно для шифрования. почему?
chtulhu 24.11.2014 13:22 # +1
очистка памяти, время выполнения операций
bormand 24.11.2014 15:07 # 0
А там числа преобразовывают в немного другое представление, в котором умножение на порядок проще.
http://en.wikipedia.org/wiki/Montgomery_reduction
P.S. Правда я походу нагнал про его применимость, ибо там умножение по модулю.
3.14159265 24.11.2014 15:10 # +1
Еще существует алгоритм Фюрера, но подробности его работы мне неизвестны.
bormand 24.11.2014 15:12 # +1
> алгоритм Фюрера
Heil, mein Führer!
3.14159265 24.11.2014 15:16 # 0
Дизайн этой штуки впечатляет, там запилено нечто вроде самопального jitа, который генерирует код, собирает статистику и выбирает наиболее оптимальный метод расчёта.
PS>То что описано у Кнута по-научному зовётся schönhage-strassen algorithm.
wvxvw 24.11.2014 10:33 # 0
LispGovno 24.11.2014 12:11 # 0