示例#1
0
        // Функція множення двох поліномів з використанням представлення їх як 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;
        }