您的位置:首页 > 其它

C - Modular multiplication of polynomials(4.3.2)

2014-07-20 11:44 288 查看
Description

Consider polynomials whose coefficients are 0 and 1. Addition of two polynomials is achieved by 'adding' the coefficients for the corresponding powers in the polynomials. The addition of coefficients is performed by addition modulo
2, i.e., (0 + 0) mod 2 = 0, (0 + 1) mod 2 = 1, (1 + 0) mod 2 = 1, and (1 + 1) mod 2 = 0. Hence, it is the same as the exclusive-or operation.

(x^6 + x^4 + x^2 + x + 1) + (x^7 + x + 1) = x^7 + x^6 + x^4 + x^2

Subtraction of two polynomials is done similarly. Since subtraction of coefficients is performed by subtraction modulo 2 which is also the exclusive-or operation, subtraction of polynomials is identical to addition of polynomials.

(x^6 + x^4 + x^2 + x + 1) - (x^7 + x + 1) = x^7 + x^6 + x^4 + x^2

Multiplication of two polynomials is done in the usual way (of course, addition of coefficients is performed by addition modulo 2).

(x^6 + x^4 + x^2 + x + 1) (x^7 + x + 1) = x^13 + x^11 + x^9 + x^8 + x^6 + x^5 + x^4 + x^3 + 1

Multiplication of two polynomials f(x) and g(x) modulo a polynomial h(x) is the remainder of f(x)g(x) divided by h(x).

(x^6 + x^4 + x^2 + x + 1) (x^7 + x + 1) modulo (x^8 + x^4 + x^3 + x + 1) = x^7 + x^6 + 1

The largest exponent of a polynomial is called its degree. For example, the degree of x^7 + x^6 + 1 is 7.

Given three polynomials f(x), g(x), and h(x), you are to write a program that computes f(x)g(x) modulo h(x).

We assume that the degrees of both f(x) and g(x) are less than the degree of h(x). The degree of a polynomial is less than 1000.

Since coefficients of a polynomial are 0 or 1, a polynomial can be represented by d+1 and a bit string of length d+1, where d is the degree of the polynomial and the bit string represents the coefficients of the polynomial. For example, x^7 + x^6 + 1 can be
represented by 8 1 1 0 0 0 0 0 1.

Input

The input consists of T test cases. The number of test cases (T) is given in the first line of the input file. Each test case consists of three lines that contain three polynomials f(x), g(x), and h(x), one per line. Each polynomial
is represented as described above.

Output

The output should contain the polynomial f(x)g(x) modulo h(x), one per line.

Sample Input

2
7 1 0 1 0 1 1 1
8 1 0 0 0 0 0 1 1
9 1 0 0 0 1 1 0 1 1
10 1 1 0 1 0 0 1 0 0 1
12 1 1 0 1 0 0 1 1 0 0 1 0
15 1 0 1 0 1 1 0 1 1 1 1 1 0 0 1


Sample Output

8 1 1 0 0 0 0 0 1
14 1 1 0 1 1 0 0 1 1 1 0 1 0 0

这道题目是多项式相乘、求模。。按照题目中的规则,可以看出,多项式的加法和减法是相同的结果,那么多项式的除法都可以用加法来计算了。


#include <iostream>

using namespace std;
int compare( int *a, int *b, int la, int lb)
{
if( la > lb)
return 1;
else if( la < lb )
return -1;
for( int i = la - 1;i >= 0; i-- )
{
if( a[i] > b[i] )
return 1;
else if( a[i] < b[i] )
return 0;
}
return 0;
}
int main()
{
int sum[20010], f[1005], g[1005], h[1005];
int ls, lf, lg, lh, n, i, j;
cin >> n;
while( n-- )
{
cin >> lf;
for( i = lf - 1; i >= 0; i-- )
cin >> f[i];
cin >> lg;
for( i = lg - 1; i >= 0; i-- )
cin >> g[i];
cin >> lh;
for( i = lh - 1; i >= 0; i-- )
cin >> h[i];

//-----------计算乘积----------

ls = lf + lg - 1;
for( i = ls - 1; i >= 0; i-- )
sum[i] = 0;
for( i = lf - 1; i >= 0; i-- )
for( j = lg - 1; j >= 0; j-- )
sum[i + j] ^= ( f[i] & g[j] );

//----------计算sum[]对h[]取模运算----------------

while( compare( sum, h, ls, lh ) >= 0 )
{
int d = ls - lh;
for( i = 0; i < lh; i++ )
sum[i + d] ^= h[i];
while( ls && !sum[ls - 1] )
ls--;
}
if( ls == 0 )
ls = 1;
cout << ls << ' ';
for( i = ls - 1; i > 0; i-- )
cout << sum[i] << ' ';
cout<< sum[i] << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: