// Функція множення двох поліномів з використанням представлення їх як bigint // Напр.: cpolinom С = A.bin_seg(B), де А і В - деякі поліноми, а С - результат множення public static cpolinom meth9_6_1(cpolinom a, cpolinom b) { // Обчислення максимальної кількості біт, яку може займати коефіцієнт полінома-результату(!) // (це важливо, тому що для зберігання коефіцієнтів поліномів-множників вистачило б ]log2(p)[ біт, // де р - модуль за яким виконуються операції над коефіцієнтами полінома) // Формулу див. тут http://www.cs.berkeley.edu/~fateman/papers/polysbyGMP.pdf (стор. 3, абзац 2) int boundary = 2 * Math.Max(a.Count, b.Count) * a.x.Max() * b.x.Max(); // пакування коефіцієнтів, множення, розпакування(див. рядок 50 - конструктор public cpolinom(BigInteger bigint, int boundary, int m)) // відповідає крокам 2-4 алгоритму 9.6.1 cpolinom res = new cpolinom(b.pack(boundary) * a.pack(boundary), boundary, a.mod); Fix(res); return res; }