1

我在 C 中实现了一个合成除法算法,如下所示:

int deflate( double r, double im, double* poly, int n ) {
    int retval;
    int i;
    if( im == 0 ) {
            if( n < 1 ) {
                    retval = 1;
            } else {
                    double* out = ( double* )malloc( ( n )*sizeof( double ) );
                    out[ n - 1 ] = poly[ n ];
                    for( i = n - 2; i >= 0; i-- ) {
                            out[ i ] = out[ i + 1 ]*r + poly[ i + 1 ];
                    }

                    for( i = 0; i < n; i++ ) {
                            poly[ i ] = out[ i ];
                    }
                    poly[ n ] = 0;
                    free( out );
                    retval = 0;
            }
    } else {
            if( n < 2 ) {
                    retval = 1;
            } else {
                    /*code to handle complex numbers here*/
                    retval = 0;
            }
    }
    return retval;
}

我试图想出一种有效的方法来为非零虚部实现这一点。具体来说,我想一次性缩小两个复共轭根,而不必使用复系数多项式。谁能想到一种方法来做到这一点?

4

1 回答 1

0

我设法找到了一种方法来做到这一点。解决方案是一个简单的理解问题,即对共轭对放气只是一次对两个根进行放气,两者都形成第二个多项式,即运算的除数:

double div1 = -2*r;
double div0 = r*r + im*im;

现在使用这两个值进行合成除法,就像在多项式和前导系数为 1 的二次项之间进行长除法一样(这基本上是实根情况下的合成除法,除了除数是线性的,是否不是二次的):

int i;
out[ n - 2 ] = poly[ n ];
out[ n - 3 ] = -out[ n - 2 ]*div1 + poly[ n - 1 ];
for( i = n - 4; i >= 0; i-- ) {
    out[ i ] = -out[ i + 2 ]*div0 + -out[ i + 1 ]*div1 + poly[ i + 2 ];
}
for( i = 0; i < n; i++ ) {
    poly[ i ] = out[ i ];
}
poly[ n - 1 ] = 0.0;
poly[ n ] = 0.0;
free( out );
retval = 0;

这完全绕过了形成复系数多项式的需要,并在一次通过中缩小了两个复数根。

于 2013-05-08T19:11:49.853 回答