合成分割算法来缩放共轭对

时间:2013-05-05 15:50:06

标签: c algorithm numerical-methods

我在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;
}

我试图想出一种有效的方法来实现这个非零虚构组件。具体来说,我想在一次通过中对两个复共轭根进行放气,而不必使用复系数多项式。谁能想到办法做到这一点?

1 个答案:

答案 0 :(得分:0)

我已经设法找到了解决方法。解决方案很简单,理解放气共轭对只是一次放气两个根,这两个根形成第二个多项式,这是操作的除数:

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

现在使用这两个值进行合成除法的方式与在多项式和二次方之间进行长除法的方式相同,其前导系数为1(这实际上是合成除法在真实情况下的情况) root,除了除数是线性的,是否是二次的):

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;

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