Changeset 094eed in git


Ignore:
Timestamp:
Dec 9, 2005, 4:00:59 PM (18 years ago)
Author:
Hans Schönemann <hannes@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
9b8fb3afe331341de66b351480d365bf44d4bee3
Parents:
c6ed6f55d03d3ddc39f98de45cab426a2f727023
Message:
*hannes: ASSERT for cf_content


git-svn-id: file:///usr/local/Singular/svn/trunk@8841 2c84dea3-7e68-4137-9b89-c4e89433aadc
Location:
factory
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • factory/canonicalform.cc

    rc6ed6f r094eed  
    11/* emacs edit mode for this file is -*- C++ -*- */
    2 /* $Id: canonicalform.cc,v 1.37 2005-12-09 09:12:53 pohl Exp $ */
     2/* $Id: canonicalform.cc,v 1.38 2005-12-09 15:00:59 Singular Exp $ */
    33
    44#include <config.h>
     
    3737    if ( ! initialized ) {
    3838#if (defined (USE_MEMUTIL) && ! defined (USE_OLD_MEMMAN)) || defined (SINGULAR)
    39         (void)mmInit();
     39        (void)mmInit();
    4040#endif
    4141
    42         (void)initializeCharacteristic();
    43         (void)initializeGMP();
    44         initPT();
    45         initialized = true;
     42        (void)initializeCharacteristic();
     43        (void)initializeGMP();
     44        initPT();
     45        initialized = true;
    4646    }
    4747    return 1;
     
    5858{
    5959    if ( is_imm( value ) )
    60         return value;
    61     else
    62         return value->copyObject();
     60        return value;
     61    else
     62        return value->copyObject();
    6363}
    6464
     
    6767{
    6868    if ( is_imm( value ) )
    69         return *this;
    70     else
    71         return CanonicalForm( value->deepCopyObject() );
     69        return *this;
     70    else
     71        return CanonicalForm( value->deepCopyObject() );
    7272}
    7373//}}}
     
    8686{
    8787    if ( is_imm( value ) == INTMARK )
    88         return true;
     88        return true;
    8989    else if ( is_imm( value ) )
    90         return false;
    91     else
    92         return value->levelcoeff() == IntegerDomain;
     90        return false;
     91    else
     92        return value->levelcoeff() == IntegerDomain;
    9393}
    9494
     
    9797{
    9898    if ( is_imm( value ) == INTMARK )
    99         return true;
     99        return true;
    100100    else if ( is_imm( value ) )
    101         return false;
    102     else
    103         return value->levelcoeff() == IntegerDomain ||
    104             value->levelcoeff() == RationalDomain;
     101        return false;
     102    else
     103        return value->levelcoeff() == IntegerDomain ||
     104            value->levelcoeff() == RationalDomain;
    105105}
    106106
     
    127127{
    128128    if ( is_imm( value ) )
    129         return true;
    130     else
    131         return value->inBaseDomain();
     129        return true;
     130    else
     131        return value->inBaseDomain();
    132132}
    133133
     
    136136{
    137137    if ( is_imm( value ) )
    138         return false;
    139     else
    140         return value->inExtension();
     138        return false;
     139    else
     140        return value->inExtension();
    141141}
    142142
     
    145145{
    146146    if ( is_imm( value ) )
    147         return true;
    148     else
    149         return value->inCoeffDomain();
     147        return true;
     148    else
     149        return value->inCoeffDomain();
    150150}
    151151
     
    154154{
    155155    if ( is_imm( value ) )
    156         return false;
    157     else
    158         return value->inPolyDomain();
     156        return false;
     157    else
     158        return value->inPolyDomain();
    159159}
    160160
     
    163163{
    164164    if ( is_imm( value ) )
    165         return false;
    166     else
    167         return value->inQuotDomain();
     165        return false;
     166    else
     167        return value->inQuotDomain();
    168168}
    169169
     
    178178{
    179179    if ( is_imm( value ) )
    180         return false;
    181     else
    182         return value->isUnivariate();
     180        return false;
     181    else
     182        return value->isUnivariate();
    183183}
    184184
     
    223223{
    224224    if ( is_imm( value ) )
    225         return imm_intval( value );
    226     else
    227         return value->intval();
     225        return imm_intval( value );
     226    else
     227        return value->intval();
    228228}
    229229
     
    233233    ASSERT( is_imm( value ) ||  ! value->inExtension(), "cannot map into different Extension" );
    234234    if ( is_imm( value ) )
    235         if ( getCharacteristic() == 0 )
    236             if ( is_imm( value ) == FFMARK )
    237                 return CanonicalForm( int2imm( ff_symmetric( imm2int( value ) ) ) );
    238             else  if ( is_imm( value ) == GFMARK )
    239                 return CanonicalForm( int2imm( ff_symmetric( gf_gf2ff( imm2int( value ) ) ) ) );
    240             else
    241                 return *this;
    242         else  if ( CFFactory::gettype() == PrimePowerDomain )
    243             return CanonicalForm( CFFactory::basic( imm2int( value ) ) );
    244         else  if ( getGFDegree() == 1 )
    245             return CanonicalForm( int2imm_p( ff_norm( imm2int( value ) ) ) );
    246         else
    247             return CanonicalForm( int2imm_gf( gf_int2gf( imm2int( value ) ) ) );
     235        if ( getCharacteristic() == 0 )
     236            if ( is_imm( value ) == FFMARK )
     237                return CanonicalForm( int2imm( ff_symmetric( imm2int( value ) ) ) );
     238            else  if ( is_imm( value ) == GFMARK )
     239                return CanonicalForm( int2imm( ff_symmetric( gf_gf2ff( imm2int( value ) ) ) ) );
     240            else
     241                return *this;
     242        else  if ( CFFactory::gettype() == PrimePowerDomain )
     243            return CanonicalForm( CFFactory::basic( imm2int( value ) ) );
     244        else  if ( getGFDegree() == 1 )
     245            return CanonicalForm( int2imm_p( ff_norm( imm2int( value ) ) ) );
     246        else
     247            return CanonicalForm( int2imm_gf( gf_int2gf( imm2int( value ) ) ) );
    248248    else  if ( value->inBaseDomain() )
    249         if ( getCharacteristic() == 0 )
    250             if ( value->levelcoeff() == PrimePowerDomain )
    251                 return CFFactory::basic( getmpi( value, true ) );
    252             else
    253                 return *this;
    254         else  if ( CFFactory::gettype() == PrimePowerDomain ) {
    255             ASSERT( value->levelcoeff() == PrimePowerDomain || value->levelcoeff() == IntegerDomain, "no proper map defined" );
    256             if ( value->levelcoeff() == PrimePowerDomain )
    257                 return *this;
    258             else
    259                 return CFFactory::basic( getmpi( value ) );
    260         }
    261         else {
    262             int val;
    263             if ( value->levelcoeff() == IntegerDomain )
    264                 val = value->intmod( ff_prime );
    265             else  if ( value->levelcoeff() == RationalDomain )
    266                 return num().mapinto() / den().mapinto();
    267             else {
    268                 ASSERT( 0, "illegal domain" );
    269                 return 0;
    270             }
    271             if ( getGFDegree() > 1 )
    272                 return CanonicalForm( int2imm_gf( gf_int2gf( val ) ) );
    273             else
    274                 return CanonicalForm( int2imm_p( val ) );
    275         }
     249        if ( getCharacteristic() == 0 )
     250            if ( value->levelcoeff() == PrimePowerDomain )
     251                return CFFactory::basic( getmpi( value, true ) );
     252            else
     253                return *this;
     254        else  if ( CFFactory::gettype() == PrimePowerDomain ) {
     255            ASSERT( value->levelcoeff() == PrimePowerDomain || value->levelcoeff() == IntegerDomain, "no proper map defined" );
     256            if ( value->levelcoeff() == PrimePowerDomain )
     257                return *this;
     258            else
     259                return CFFactory::basic( getmpi( value ) );
     260        }
     261        else {
     262            int val;
     263            if ( value->levelcoeff() == IntegerDomain )
     264                val = value->intmod( ff_prime );
     265            else  if ( value->levelcoeff() == RationalDomain )
     266                return num().mapinto() / den().mapinto();
     267            else {
     268                ASSERT( 0, "illegal domain" );
     269                return 0;
     270            }
     271            if ( getGFDegree() > 1 )
     272                return CanonicalForm( int2imm_gf( gf_int2gf( val ) ) );
     273            else
     274                return CanonicalForm( int2imm_p( val ) );
     275        }
    276276    else {
    277         Variable x = value->variable();
    278         CanonicalForm result;
    279         for ( CFIterator i = *this; i.hasTerms(); i++ )
    280             result += power( x, i.exp() ) * i.coeff().mapinto();
    281         return result;
     277        Variable x = value->variable();
     278        CanonicalForm result;
     279        for ( CFIterator i = *this; i.hasTerms(); i++ )
     280            result += power( x, i.exp() ) * i.coeff().mapinto();
     281        return result;
    282282    }
    283283}
     
    301301// algebraic extension are considered coefficients so Lc() always
    302302// returns a leading coefficient in a coefficient domain.
    303 // 
     303//
    304304// LC() returns the leading coefficient of CO where CO is
    305305// considered a univariate polynomial in its main variable.  An
     
    335335{
    336336    if ( is_imm( value ) )
    337         return *this;
    338     else
    339         return value->lc();
     337        return *this;
     338    else
     339        return value->lc();
    340340}
    341341
     
    344344{
    345345    if ( is_imm( value ) || value->inCoeffDomain() )
    346         return *this;
    347     else
    348         return value->Lc();
     346        return *this;
     347    else
     348        return value->Lc();
    349349}
    350350
     
    353353{
    354354    if ( is_imm( value ) )
    355         return *this;
    356     else
    357         return value->LC();
     355        return *this;
     356    else
     357        return value->LC();
    358358}
    359359
     
    362362{
    363363    if ( is_imm( value ) || value->inCoeffDomain() )
    364         return *this;
     364        return *this;
    365365
    366366    Variable x = value->variable();
    367367    if ( v > x )
    368         return *this;
     368        return *this;
    369369    else if ( v == x )
    370         return value->LC();
     370        return value->LC();
    371371    else {
    372         CanonicalForm f = swapvar( *this, v, x );
    373         if ( f.mvar() == x )
    374             return swapvar( f.value->LC(), v, x );
    375         else
    376             // v did not occur in f
    377             return *this;
     372        CanonicalForm f = swapvar( *this, v, x );
     373         if ( f.mvar() == x )
     374             return swapvar( f.value->LC(), v, x );
     375         else
     376            // v did not occur in f
     377            return *this;
    378378    }
    379379}
     
    404404    int what = is_imm( value );
    405405    if ( what )
    406         if ( what == FFMARK )
    407             return imm_iszero_p( value ) ? -1 : 0;
    408         else if ( what == INTMARK )
    409             return imm_iszero( value ) ? -1 : 0;
    410         else
    411             return imm_iszero_gf( value ) ? -1 : 0;
    412     else
    413         return value->degree();
     406        if ( what == FFMARK )
     407            return imm_iszero_p( value ) ? -1 : 0;
     408        else if ( what == INTMARK )
     409            return imm_iszero( value ) ? -1 : 0;
     410        else
     411            return imm_iszero_gf( value ) ? -1 : 0;
     412    else
     413        return value->degree();
    414414}
    415415
     
    419419    int what = is_imm( value );
    420420    if ( what )
    421         if ( what == FFMARK )
    422             return imm_iszero_p( value ) ? -1 : 0;
    423         else if ( what == INTMARK )
    424             return imm_iszero( value ) ? -1 : 0;
    425         else
    426             return imm_iszero_gf( value ) ? -1 : 0;
     421        if ( what == FFMARK )
     422            return imm_iszero_p( value ) ? -1 : 0;
     423        else if ( what == INTMARK )
     424            return imm_iszero( value ) ? -1 : 0;
     425        else
     426            return imm_iszero_gf( value ) ? -1 : 0;
    427427    else if ( value->inBaseDomain() )
    428         return value->degree();
     428        return value->degree();
    429429
    430430    Variable x = value->variable();
    431431    if ( v == x )
    432         return value->degree();
     432        return value->degree();
    433433    else  if ( v > x )
    434         // relatively to v, f is in a coefficient ring
    435         return 0;
     434        // relatively to v, f is in a coefficient ring
     435        return 0;
    436436    else {
    437         int coeffdeg, result = 0;
    438         // search for maximum of coefficient degree
    439         for ( CFIterator i = *this; i.hasTerms(); i++ ) {
    440             coeffdeg = i.coeff().degree( v );
    441             if ( coeffdeg > result )
    442                 result = coeffdeg;
    443         }
    444         return result;
     437        int coeffdeg, result = 0;
     438        // search for maximum of coefficient degree
     439        for ( CFIterator i = *this; i.hasTerms(); i++ ) {
     440            coeffdeg = i.coeff().degree( v );
     441            if ( coeffdeg > result )
     442                result = coeffdeg;
     443        }
     444        return result;
    445445    }
    446446}
     
    474474{
    475475    if ( is_imm( value ) || value->inCoeffDomain() )
    476         return *this;
    477     else
    478         return value->tailcoeff();
     476        return *this;
     477    else
     478        return value->tailcoeff();
    479479}
    480480
     
    484484    int what = is_imm( value );
    485485    if ( what )
    486         if ( what == FFMARK )
    487             return imm_iszero_p( value ) ? -1 : 0;
    488         else if ( what == INTMARK )
    489             return imm_iszero( value ) ? -1 : 0;
    490         else
    491             return imm_iszero_gf( value ) ? -1 : 0;
    492     else
    493         return value->taildegree();
     486        if ( what == FFMARK )
     487            return imm_iszero_p( value ) ? -1 : 0;
     488        else if ( what == INTMARK )
     489            return imm_iszero( value ) ? -1 : 0;
     490        else
     491            return imm_iszero_gf( value ) ? -1 : 0;
     492    else
     493        return value->taildegree();
    494494}
    495495//}}}
     
    509509// InternalPoly::level(), InternalPoly::variable(), ::level(),
    510510// ::mvar()
    511 // 
     511//
    512512//}}}
    513513int
     
    515515{
    516516    if ( is_imm( value ) )
    517         return LEVELBASE;
    518     else
    519         return value->level();
     517        return LEVELBASE;
     518    else
     519        return value->level();
    520520}
    521521
     
    524524{
    525525    if ( is_imm( value ) )
    526         return Variable();
    527     else
    528         return value->variable();
     526        return Variable();
     527    else
     528        return value->variable();
    529529}
    530530//}}}
     
    550550{
    551551    if ( is_imm( value ) )
    552         return *this;
    553     else
    554         return CanonicalForm( value->num() );
     552        return *this;
     553    else
     554        return CanonicalForm( value->num() );
    555555}
    556556
     
    559559{
    560560    if ( is_imm( value ) )
    561         return CanonicalForm( 1 );
    562     else
    563         return CanonicalForm( value->den() );
     561        return CanonicalForm( 1 );
     562    else
     563        return CanonicalForm( value->den() );
    564564}
    565565//}}}
     
    571571    int what = is_imm( value );
    572572    if ( what ) {
    573         ASSERT ( ! is_imm( cf.value ) || (what==is_imm( cf.value )), "illegal base coefficients" );
    574         if ( (what = is_imm( cf.value )) == FFMARK )
    575             value = imm_add_p( value, cf.value );
    576         else  if ( what == GFMARK )
    577             value = imm_add_gf( value, cf.value );
    578         else  if ( what )
    579             value = imm_add( value, cf.value );
    580         else {
    581             InternalCF * dummy = cf.value->copyObject();
    582             value = dummy->addcoeff( value );
    583         }
     573        ASSERT ( ! is_imm( cf.value ) || (what==is_imm( cf.value )), "illegal base coefficients" );
     574        if ( (what = is_imm( cf.value )) == FFMARK )
     575            value = imm_add_p( value, cf.value );
     576        else  if ( what == GFMARK )
     577            value = imm_add_gf( value, cf.value );
     578        else  if ( what )
     579            value = imm_add( value, cf.value );
     580        else {
     581            InternalCF * dummy = cf.value->copyObject();
     582            value = dummy->addcoeff( value );
     583        }
    584584    }
    585585    else  if ( is_imm( cf.value ) )
    586         value = value->addcoeff( cf.value );
     586        value = value->addcoeff( cf.value );
    587587    else  if ( value->level() == cf.value->level() ) {
    588         if ( value->levelcoeff() == cf.value->levelcoeff() )
    589             value = value->addsame( cf.value );
    590         else  if ( value->levelcoeff() > cf.value->levelcoeff() )
    591             value = value->addcoeff( cf.value );
    592         else {
    593             InternalCF * dummy = cf.value->copyObject();
    594             dummy = dummy->addcoeff( value );
    595             if ( value->deleteObject() ) delete value;
    596             value = dummy;
    597         }
     588        if ( value->levelcoeff() == cf.value->levelcoeff() )
     589            value = value->addsame( cf.value );
     590        else  if ( value->levelcoeff() > cf.value->levelcoeff() )
     591            value = value->addcoeff( cf.value );
     592        else {
     593            InternalCF * dummy = cf.value->copyObject();
     594            dummy = dummy->addcoeff( value );
     595            if ( value->deleteObject() ) delete value;
     596            value = dummy;
     597        }
    598598    }
    599599    else  if ( level() > cf.level() )
    600         value = value->addcoeff( cf.value );
     600        value = value->addcoeff( cf.value );
    601601    else {
    602         InternalCF * dummy = cf.value->copyObject();
    603         dummy = dummy->addcoeff( value );
    604         if ( value->deleteObject() ) delete value;
    605         value = dummy;
     602        InternalCF * dummy = cf.value->copyObject();
     603        dummy = dummy->addcoeff( value );
     604        if ( value->deleteObject() ) delete value;
     605        value = dummy;
    606606    }
    607607    return *this;
     
    613613    int what = is_imm( value );
    614614    if ( what ) {
    615         ASSERT ( ! is_imm( cf.value ) || (what==is_imm( cf.value )), "illegal base coefficients" );
    616         if ( (what = is_imm( cf.value )) == FFMARK )
    617             value = imm_sub_p( value, cf.value );
    618         else  if ( what == GFMARK )
    619             value = imm_sub_gf( value, cf.value );
    620         else  if ( what )
    621             value = imm_sub( value, cf.value );
    622         else {
    623             InternalCF * dummy = cf.value->copyObject();
    624             value = dummy->subcoeff( value, true );
    625         }
     615        ASSERT ( ! is_imm( cf.value ) || (what==is_imm( cf.value )), "illegal base coefficients" );
     616        if ( (what = is_imm( cf.value )) == FFMARK )
     617            value = imm_sub_p( value, cf.value );
     618        else  if ( what == GFMARK )
     619            value = imm_sub_gf( value, cf.value );
     620        else  if ( what )
     621            value = imm_sub( value, cf.value );
     622        else {
     623            InternalCF * dummy = cf.value->copyObject();
     624            value = dummy->subcoeff( value, true );
     625        }
    626626    }
    627627    else  if ( is_imm( cf.value ) )
    628         value = value->subcoeff( cf.value, false );
     628        value = value->subcoeff( cf.value, false );
    629629    else  if ( value->level() == cf.value->level() ) {
    630         if ( value->levelcoeff() == cf.value->levelcoeff() )
    631             value = value->subsame( cf.value );
    632         else  if ( value->levelcoeff() > cf.value->levelcoeff() )
    633             value = value->subcoeff( cf.value, false );
    634         else {
    635             InternalCF * dummy = cf.value->copyObject();
    636             dummy = dummy->subcoeff( value, true );
    637             if ( value->deleteObject() ) delete value;
    638             value = dummy;
    639         }
     630        if ( value->levelcoeff() == cf.value->levelcoeff() )
     631            value = value->subsame( cf.value );
     632        else  if ( value->levelcoeff() > cf.value->levelcoeff() )
     633            value = value->subcoeff( cf.value, false );
     634        else {
     635            InternalCF * dummy = cf.value->copyObject();
     636            dummy = dummy->subcoeff( value, true );
     637            if ( value->deleteObject() ) delete value;
     638            value = dummy;
     639        }
    640640    }
    641641    else  if ( level() > cf.level() )
    642         value = value->subcoeff( cf.value, false );
     642        value = value->subcoeff( cf.value, false );
    643643    else {
    644         InternalCF * dummy = cf.value->copyObject();
    645         dummy = dummy->subcoeff( value, true );
    646         if ( value->deleteObject() ) delete value;
    647         value = dummy;
     644        InternalCF * dummy = cf.value->copyObject();
     645        dummy = dummy->subcoeff( value, true );
     646        if ( value->deleteObject() ) delete value;
     647        value = dummy;
    648648    }
    649649    return *this;
     
    655655    int what = is_imm( value );
    656656    if ( what ) {
    657         ASSERT ( ! is_imm( cf.value ) || (what==is_imm( cf.value )), "illegal base coefficients" );
    658         if ( (what = is_imm( cf.value )) == FFMARK )
    659             value = imm_mul_p( value, cf.value );
    660         else  if ( what == GFMARK )
    661             value = imm_mul_gf( value, cf.value );
    662         else  if ( what )
    663             value = imm_mul( value, cf.value );
    664         else {
    665             InternalCF * dummy = cf.value->copyObject();
    666             value = dummy->mulcoeff( value );
    667         }
     657        ASSERT ( ! is_imm( cf.value ) || (what==is_imm( cf.value )), "illegal base coefficients" );
     658        if ( (what = is_imm( cf.value )) == FFMARK )
     659            value = imm_mul_p( value, cf.value );
     660        else  if ( what == GFMARK )
     661            value = imm_mul_gf( value, cf.value );
     662        else  if ( what )
     663            value = imm_mul( value, cf.value );
     664        else {
     665            InternalCF * dummy = cf.value->copyObject();
     666            value = dummy->mulcoeff( value );
     667        }
    668668    }
    669669    else  if ( is_imm( cf.value ) )
    670         value = value->mulcoeff( cf.value );
     670        value = value->mulcoeff( cf.value );
    671671    else  if ( value->level() == cf.value->level() ) {
    672         if ( value->levelcoeff() == cf.value->levelcoeff() )
    673             value = value->mulsame( cf.value );
    674         else  if ( value->levelcoeff() > cf.value->levelcoeff() )
    675             value = value->mulcoeff( cf.value );
    676         else {
    677             InternalCF * dummy = cf.value->copyObject();
    678             dummy = dummy->mulcoeff( value );
    679             if ( value->deleteObject() ) delete value;
    680             value = dummy;
    681         }
     672        if ( value->levelcoeff() == cf.value->levelcoeff() )
     673            value = value->mulsame( cf.value );
     674        else  if ( value->levelcoeff() > cf.value->levelcoeff() )
     675            value = value->mulcoeff( cf.value );
     676        else {
     677            InternalCF * dummy = cf.value->copyObject();
     678            dummy = dummy->mulcoeff( value );
     679            if ( value->deleteObject() ) delete value;
     680            value = dummy;
     681        }
    682682    }
    683683    else  if ( level() > cf.level() )
    684         value = value->mulcoeff( cf.value );
     684        value = value->mulcoeff( cf.value );
    685685    else {
    686         InternalCF * dummy = cf.value->copyObject();
    687         dummy = dummy->mulcoeff( value );
    688         if ( value->deleteObject() ) delete value;
    689         value = dummy;
     686        InternalCF * dummy = cf.value->copyObject();
     687        dummy = dummy->mulcoeff( value );
     688        if ( value->deleteObject() ) delete value;
     689        value = dummy;
    690690    }
    691691    return *this;
     
    697697    int what = is_imm( value );
    698698    if ( what ) {
    699         ASSERT ( ! is_imm( cf.value ) || (what==is_imm( cf.value )), "illegal base coefficients" );
    700         if ( (what = is_imm( cf.value )) == FFMARK )
    701             value = imm_div_p( value, cf.value );
    702         else  if ( what == GFMARK )
    703             value = imm_div_gf( value, cf.value );
    704         else  if ( what )
    705             value = imm_divrat( value, cf.value );
    706         else {
    707             InternalCF * dummy = cf.value->copyObject();
    708             value = dummy->dividecoeff( value, true );
    709         }
     699        ASSERT ( ! is_imm( cf.value ) || (what==is_imm( cf.value )), "illegal base coefficients" );
     700        if ( (what = is_imm( cf.value )) == FFMARK )
     701            value = imm_div_p( value, cf.value );
     702        else  if ( what == GFMARK )
     703            value = imm_div_gf( value, cf.value );
     704        else  if ( what )
     705            value = imm_divrat( value, cf.value );
     706        else {
     707            InternalCF * dummy = cf.value->copyObject();
     708            value = dummy->dividecoeff( value, true );
     709        }
    710710    }
    711711    else  if ( is_imm( cf.value ) )
    712         value = value->dividecoeff( cf.value, false );
     712        value = value->dividecoeff( cf.value, false );
    713713    else  if ( value->level() == cf.value->level() ) {
    714         if ( value->levelcoeff() == cf.value->levelcoeff() )
    715             value = value->dividesame( cf.value );
    716         else  if ( value->levelcoeff() > cf.value->levelcoeff() )
    717             value = value->dividecoeff( cf.value, false );
    718         else {
    719             InternalCF * dummy = cf.value->copyObject();
    720             dummy = dummy->dividecoeff( value, true );
    721             if ( value->deleteObject() ) delete value;
    722             value = dummy;
    723         }
     714        if ( value->levelcoeff() == cf.value->levelcoeff() )
     715            value = value->dividesame( cf.value );
     716        else  if ( value->levelcoeff() > cf.value->levelcoeff() )
     717            value = value->dividecoeff( cf.value, false );
     718        else {
     719            InternalCF * dummy = cf.value->copyObject();
     720            dummy = dummy->dividecoeff( value, true );
     721            if ( value->deleteObject() ) delete value;
     722            value = dummy;
     723        }
    724724    }
    725725    else  if ( level() > cf.level() )
    726         value = value->dividecoeff( cf.value, false );
     726        value = value->dividecoeff( cf.value, false );
    727727    else {
    728         InternalCF * dummy = cf.value->copyObject();
    729         dummy = dummy->dividecoeff( value, true );
    730         if ( value->deleteObject() ) delete value;
    731         value = dummy;
     728        InternalCF * dummy = cf.value->copyObject();
     729        dummy = dummy->dividecoeff( value, true );
     730        if ( value->deleteObject() ) delete value;
     731        value = dummy;
    732732    }
    733733    return *this;
     
    739739    int what = is_imm( value );
    740740    if ( what ) {
    741         ASSERT ( ! is_imm( cf.value ) || (what==is_imm( cf.value )), "illegal base coefficients" );
    742         if ( (what = is_imm( cf.value )) == FFMARK )
    743             value = imm_div_p( value, cf.value );
    744         else  if ( what == GFMARK )
    745             value = imm_div_gf( value, cf.value );
    746         else  if ( what )
    747             value = imm_div( value, cf.value );
    748         else {
    749             InternalCF * dummy = cf.value->copyObject();
    750             value = dummy->divcoeff( value, true );
    751         }
     741        ASSERT ( ! is_imm( cf.value ) || (what==is_imm( cf.value )), "illegal base coefficients" );
     742        if ( (what = is_imm( cf.value )) == FFMARK )
     743            value = imm_div_p( value, cf.value );
     744        else  if ( what == GFMARK )
     745            value = imm_div_gf( value, cf.value );
     746        else  if ( what )
     747            value = imm_div( value, cf.value );
     748        else {
     749            InternalCF * dummy = cf.value->copyObject();
     750            value = dummy->divcoeff( value, true );
     751        }
    752752    }
    753753    else  if ( is_imm( cf.value ) )
    754         value = value->divcoeff( cf.value, false );
     754        value = value->divcoeff( cf.value, false );
    755755    else  if ( value->level() == cf.value->level() ) {
    756         if ( value->levelcoeff() == cf.value->levelcoeff() )
    757             value = value->divsame( cf.value );
    758         else  if ( value->levelcoeff() > cf.value->levelcoeff() )
    759             value = value->divcoeff( cf.value, false );
    760         else {
    761             InternalCF * dummy = cf.value->copyObject();
    762             dummy = dummy->divcoeff( value, true );
    763             if ( value->deleteObject() ) delete value;
    764             value = dummy;
    765         }
     756        if ( value->levelcoeff() == cf.value->levelcoeff() )
     757            value = value->divsame( cf.value );
     758        else  if ( value->levelcoeff() > cf.value->levelcoeff() )
     759            value = value->divcoeff( cf.value, false );
     760        else {
     761            InternalCF * dummy = cf.value->copyObject();
     762            dummy = dummy->divcoeff( value, true );
     763            if ( value->deleteObject() ) delete value;
     764            value = dummy;
     765        }
    766766    }
    767767    else  if ( level() > cf.level() )
    768         value = value->divcoeff( cf.value, false );
     768        value = value->divcoeff( cf.value, false );
    769769    else {
    770         InternalCF * dummy = cf.value->copyObject();
    771         dummy = dummy->divcoeff( value, true );
    772         if ( value->deleteObject() ) delete value;
    773         value = dummy;
     770        InternalCF * dummy = cf.value->copyObject();
     771        dummy = dummy->divcoeff( value, true );
     772        if ( value->deleteObject() ) delete value;
     773        value = dummy;
    774774    }
    775775    return *this;
     
    781781    int what = is_imm( value );
    782782    if ( what ) {
    783         ASSERT ( ! is_imm( cf.value ) || (what==is_imm( cf.value )), "illegal base coefficients" );
    784         if ( (what = is_imm( cf.value )) == FFMARK )
    785             value = imm_mod_p( value, cf.value );
    786         else  if ( what == GFMARK )
    787             value = imm_mod_gf( value, cf.value );
    788         else  if ( what )
    789             value = imm_mod( value, cf.value );
    790         else {
    791             InternalCF * dummy = cf.value->copyObject();
    792             value = dummy->modulocoeff( value, true );
    793         }
     783        ASSERT ( ! is_imm( cf.value ) || (what==is_imm( cf.value )), "illegal base coefficients" );
     784        if ( (what = is_imm( cf.value )) == FFMARK )
     785            value = imm_mod_p( value, cf.value );
     786        else  if ( what == GFMARK )
     787            value = imm_mod_gf( value, cf.value );
     788        else  if ( what )
     789            value = imm_mod( value, cf.value );
     790        else {
     791            InternalCF * dummy = cf.value->copyObject();
     792            value = dummy->modulocoeff( value, true );
     793        }
    794794    }
    795795    else  if ( is_imm( cf.value ) )
    796         value = value->modulocoeff( cf.value, false );
     796        value = value->modulocoeff( cf.value, false );
    797797    else  if ( value->level() == cf.value->level() ) {
    798         if ( value->levelcoeff() == cf.value->levelcoeff() )
    799             value = value->modulosame( cf.value );
    800         else  if ( value->levelcoeff() > cf.value->levelcoeff() )
    801             value = value->modulocoeff( cf.value, false );
    802         else {
    803             InternalCF * dummy = cf.value->copyObject();
    804             dummy = dummy->modulocoeff( value, true );
    805             if ( value->deleteObject() ) delete value;
    806             value = dummy;
    807         }
     798        if ( value->levelcoeff() == cf.value->levelcoeff() )
     799            value = value->modulosame( cf.value );
     800        else  if ( value->levelcoeff() > cf.value->levelcoeff() )
     801            value = value->modulocoeff( cf.value, false );
     802        else {
     803            InternalCF * dummy = cf.value->copyObject();
     804            dummy = dummy->modulocoeff( value, true );
     805            if ( value->deleteObject() ) delete value;
     806            value = dummy;
     807        }
    808808    }
    809809    else  if ( level() > cf.level() )
    810         value = value->modulocoeff( cf.value, false );
     810        value = value->modulocoeff( cf.value, false );
    811811    else {
    812         InternalCF * dummy = cf.value->copyObject();
    813         dummy = dummy->modulocoeff( value, true );
    814         if ( value->deleteObject() ) delete value;
    815         value = dummy;
     812        InternalCF * dummy = cf.value->copyObject();
     813        dummy = dummy->modulocoeff( value, true );
     814        if ( value->deleteObject() ) delete value;
     815        value = dummy;
    816816    }
    817817    return *this;
     
    823823    int what = is_imm( value );
    824824    if ( what ) {
    825         ASSERT ( ! is_imm( cf.value ) || (what==is_imm( cf.value )), "illegal base coefficients" );
    826         if ( (what = is_imm( cf.value )) == FFMARK )
    827             value = imm_mod_p( value, cf.value );
    828         else  if ( what == GFMARK )
    829             value = imm_mod_gf( value, cf.value );
    830         else  if ( what )
    831             value = imm_mod( value, cf.value );
    832         else {
    833             InternalCF * dummy = cf.value->copyObject();
    834             value = dummy->modcoeff( value, true );
    835         }
     825        ASSERT ( ! is_imm( cf.value ) || (what==is_imm( cf.value )), "illegal base coefficients" );
     826        if ( (what = is_imm( cf.value )) == FFMARK )
     827            value = imm_mod_p( value, cf.value );
     828        else  if ( what == GFMARK )
     829            value = imm_mod_gf( value, cf.value );
     830        else  if ( what )
     831            value = imm_mod( value, cf.value );
     832        else {
     833            InternalCF * dummy = cf.value->copyObject();
     834            value = dummy->modcoeff( value, true );
     835        }
    836836    }
    837837    else  if ( is_imm( cf.value ) )
    838         value = value->modcoeff( cf.value, false );
     838        value = value->modcoeff( cf.value, false );
    839839    else  if ( value->level() == cf.value->level() ) {
    840         if ( value->levelcoeff() == cf.value->levelcoeff() )
    841             value = value->modsame( cf.value );
    842         else  if ( value->levelcoeff() > cf.value->levelcoeff() )
    843             value = value->modcoeff( cf.value, false );
    844         else {
    845             InternalCF * dummy = cf.value->copyObject();
    846             dummy = dummy->modcoeff( value, true );
    847             if ( value->deleteObject() ) delete value;
    848             value = dummy;
    849         }
     840        if ( value->levelcoeff() == cf.value->levelcoeff() )
     841            value = value->modsame( cf.value );
     842        else  if ( value->levelcoeff() > cf.value->levelcoeff() )
     843            value = value->modcoeff( cf.value, false );
     844        else {
     845            InternalCF * dummy = cf.value->copyObject();
     846            dummy = dummy->modcoeff( value, true );
     847            if ( value->deleteObject() ) delete value;
     848            value = dummy;
     849        }
    850850    }
    851851    else  if ( level() > cf.level() )
    852         value = value->modcoeff( cf.value, false );
     852        value = value->modcoeff( cf.value, false );
    853853    else {
    854         InternalCF * dummy = cf.value->copyObject();
    855         dummy = dummy->modcoeff( value, true );
    856         if ( value->deleteObject() ) delete value;
    857         value = dummy;
     854        InternalCF * dummy = cf.value->copyObject();
     855        dummy = dummy->modcoeff( value, true );
     856        if ( value->deleteObject() ) delete value;
     857        value = dummy;
    858858    }
    859859    return *this;
     
    866866    int what = is_imm( f.value );
    867867    if ( what )
    868         if ( is_imm( g.value ) ) {
    869             if ( what == FFMARK )
    870                 imm_divrem_p( f.value, g.value, qq, rr );
    871             else  if ( what == GFMARK )
    872                 imm_divrem_gf( f.value, g.value, qq, rr );
    873             else
    874                 imm_divrem( f.value, g.value, qq, rr );
    875         }
    876         else
    877             g.value->divremcoeff( f.value, qq, rr, true );
     868        if ( is_imm( g.value ) ) {
     869            if ( what == FFMARK )
     870                imm_divrem_p( f.value, g.value, qq, rr );
     871            else  if ( what == GFMARK )
     872                imm_divrem_gf( f.value, g.value, qq, rr );
     873            else
     874                imm_divrem( f.value, g.value, qq, rr );
     875        }
     876        else
     877            g.value->divremcoeff( f.value, qq, rr, true );
    878878    else  if ( (what=is_imm( g.value )) )
    879         f.value->divremcoeff( g.value, qq, rr, false );
     879        f.value->divremcoeff( g.value, qq, rr, false );
    880880    else  if ( f.value->level() == g.value->level() )
    881         if ( f.value->levelcoeff() == g.value->levelcoeff() )
    882             f.value->divremsame( g.value, qq, rr );
    883         else  if ( f.value->levelcoeff() > g.value->levelcoeff() )
    884             f.value->divremcoeff( g.value, qq, rr, false );
    885         else
    886             g.value->divremcoeff( f.value, qq, rr, true );
     881        if ( f.value->levelcoeff() == g.value->levelcoeff() )
     882            f.value->divremsame( g.value, qq, rr );
     883        else  if ( f.value->levelcoeff() > g.value->levelcoeff() )
     884            f.value->divremcoeff( g.value, qq, rr, false );
     885        else
     886            g.value->divremcoeff( f.value, qq, rr, true );
    887887    else  if ( f.value->level() > g.value->level() )
    888         f.value->divremcoeff( g.value, qq, rr, false );
    889     else
    890         g.value->divremcoeff( f.value, qq, rr, true );
     888        f.value->divremcoeff( g.value, qq, rr, false );
     889    else
     890        g.value->divremcoeff( f.value, qq, rr, true );
    891891    ASSERT( qq != 0 && rr != 0, "error in divrem" );
    892892    q = CanonicalForm( qq );
     
    901901    bool result = true;
    902902    if ( what )
    903         if ( is_imm( g.value ) ) {
    904             if ( what == FFMARK )
    905                 imm_divrem_p( f.value, g.value, qq, rr );
    906             else  if ( what == GFMARK )
    907                 imm_divrem_gf( f.value, g.value, qq, rr );
    908             else
    909                 imm_divrem( f.value, g.value, qq, rr );
    910         }
    911         else
    912             result = g.value->divremcoefft( f.value, qq, rr, true );
     903        if ( is_imm( g.value ) ) {
     904            if ( what == FFMARK )
     905                imm_divrem_p( f.value, g.value, qq, rr );
     906            else  if ( what == GFMARK )
     907                imm_divrem_gf( f.value, g.value, qq, rr );
     908            else
     909                imm_divrem( f.value, g.value, qq, rr );
     910        }
     911        else
     912            result = g.value->divremcoefft( f.value, qq, rr, true );
    913913    else  if ( (what=is_imm( g.value )) )
    914         result = f.value->divremcoefft( g.value, qq, rr, false );
     914        result = f.value->divremcoefft( g.value, qq, rr, false );
    915915    else  if ( f.value->level() == g.value->level() )
    916         if ( f.value->levelcoeff() == g.value->levelcoeff() )
    917             result = f.value->divremsamet( g.value, qq, rr );
    918         else  if ( f.value->levelcoeff() > g.value->levelcoeff() )
    919             result = f.value->divremcoefft( g.value, qq, rr, false );
    920         else
    921             result = g.value->divremcoefft( f.value, qq, rr, true );
     916        if ( f.value->levelcoeff() == g.value->levelcoeff() )
     917            result = f.value->divremsamet( g.value, qq, rr );
     918        else  if ( f.value->levelcoeff() > g.value->levelcoeff() )
     919            result = f.value->divremcoefft( g.value, qq, rr, false );
     920        else
     921            result = g.value->divremcoefft( f.value, qq, rr, true );
    922922    else  if ( f.value->level() > g.value->level() )
    923         result = f.value->divremcoefft( g.value, qq, rr, false );
    924     else
    925         result = g.value->divremcoefft( f.value, qq, rr, true );
     923        result = f.value->divremcoefft( g.value, qq, rr, false );
     924    else
     925        result = g.value->divremcoefft( f.value, qq, rr, true );
    926926    if ( result ) {
    927         ASSERT( qq != 0 && rr != 0, "error in divrem" );
    928         q = CanonicalForm( qq );
    929         r = CanonicalForm( rr );
     927        ASSERT( qq != 0 && rr != 0, "error in divrem" );
     928        q = CanonicalForm( qq );
     929        r = CanonicalForm( rr );
    930930    }
    931931    else {
    932         q = 0; r = 0;
     932        q = 0; r = 0;
    933933    }
    934934    return result;
     
    956956{
    957957    if ( is_imm( value ) || value->inBaseDomain() )
    958         return *this;
     958        return *this;
    959959    else {
    960960#if 0
    961         CFIterator i = *this;
    962         int lastExp = i.exp();
    963         CanonicalForm result = i.coeff();
    964         i++;
    965         while ( i.hasTerms() ) {
    966             if ( (lastExp - i.exp()) == 1 )
    967                 result *= f;
    968             else
    969                 result *= power( f, lastExp - i.exp() );
    970             result += i.coeff();
    971             lastExp = i.exp();
    972             i++;
    973         }
    974         if ( lastExp != 0 )
    975             result *= power( f, lastExp );
     961        CFIterator i = *this;
     962        int lastExp = i.exp();
     963        CanonicalForm result = i.coeff();
     964        i++;
     965        while ( i.hasTerms() ) {
     966            if ( (lastExp - i.exp()) == 1 )
     967                result *= f;
     968            else
     969                result *= power( f, lastExp - i.exp() );
     970            result += i.coeff();
     971            lastExp = i.exp();
     972            i++;
     973        }
     974        if ( lastExp != 0 )
     975            result *= power( f, lastExp );
    976976#else
    977         CFIterator i = *this;
    978         int lastExp = i.exp();
    979         CanonicalForm result = i.coeff();
    980         i++;
    981         while ( i.hasTerms() )
     977        CFIterator i = *this;
     978        int lastExp = i.exp();
     979        CanonicalForm result = i.coeff();
     980        i++;
     981        while ( i.hasTerms() )
    982982        {
    983983            int i_exp=i.exp();
    984             if ( (lastExp - i_exp /* i.exp()*/) == 1 )
    985                 result *= f;
    986             else
    987                 result *= power( f, lastExp - i_exp /*i.exp()*/ );
    988             result += i.coeff();
    989             lastExp = i_exp /*i.exp()*/;
    990             i++;
    991         }
    992         if ( lastExp != 0 )
    993             result *= power( f, lastExp );
     984            if ( (lastExp - i_exp /* i.exp()*/) == 1 )
     985                result *= f;
     986            else
     987                result *= power( f, lastExp - i_exp /*i.exp()*/ );
     988            result += i.coeff();
     989            lastExp = i_exp /*i.exp()*/;
     990            i++;
     991        }
     992        if ( lastExp != 0 )
     993            result *= power( f, lastExp );
    994994#endif
    995         return result;
     995        return result;
    996996    }
    997997}
     
    10011001{
    10021002    if ( is_imm( value ) || value->inBaseDomain() )
    1003         return *this;
     1003        return *this;
    10041004
    10051005    Variable x = value->variable();
    10061006    if ( v > x )
    1007         return *this;
     1007        return *this;
    10081008    else  if ( v == x )
    1009         return (*this)( f );
     1009        return (*this)( f );
    10101010    else {
    1011         // v is less than main variable of f
    1012         CanonicalForm result = 0;
    1013         for ( CFIterator i = *this; i.hasTerms(); i++ )
    1014             result += i.coeff()( f, v ) * power( x, i.exp() );
    1015         return result;
     1011        // v is less than main variable of f
     1012        CanonicalForm result = 0;
     1013        for ( CFIterator i = *this; i.hasTerms(); i++ )
     1014            result += i.coeff()( f, v ) * power( x, i.exp() );
     1015        return result;
    10161016    }
    10171017}
     
    10561056    ASSERT( i >= 0, "index to operator [] less than zero" );
    10571057    if ( is_imm( value ) )
    1058         if ( i == 0 )
    1059             return *this;
    1060         else
    1061             return CanonicalForm( 0 );
    1062     else
    1063         return value->coeff( i );
     1058        if ( i == 0 )
     1059            return *this;
     1060        else
     1061            return CanonicalForm( 0 );
     1062    else
     1063        return value->coeff( i );
    10641064}
    10651065//}}}
     
    10841084{
    10851085    if ( is_imm( value ) || value->inCoeffDomain() )
    1086         return CanonicalForm( 0 );
     1086        return CanonicalForm( 0 );
    10871087    else {
    1088         CanonicalForm result = 0;
    1089         Variable x = value->variable();
    1090         for ( CFIterator i = *this; i.hasTerms(); i++ )
    1091             if ( i.exp() > 0 )
    1092                 result += power( x, i.exp()-1 ) * i.coeff() * i.exp();
    1093         return result;
     1088        CanonicalForm result = 0;
     1089        Variable x = value->variable();
     1090        for ( CFIterator i = *this; i.hasTerms(); i++ )
     1091            if ( i.exp() > 0 )
     1092                result += power( x, i.exp()-1 ) * i.coeff() * i.exp();
     1093        return result;
    10941094    }
    10951095}
     
    11001100    ASSERT( x.level() > 0, "cannot derive with respect to algebraic variables" );
    11011101    if ( is_imm( value ) || value->inCoeffDomain() )
    1102         return CanonicalForm( 0 );
     1102        return CanonicalForm( 0 );
    11031103
    11041104    Variable y = value->variable();
    11051105    if ( x > y )
    1106         return CanonicalForm( 0 );
     1106        return CanonicalForm( 0 );
    11071107    else if ( x == y )
    1108         return deriv();
     1108        return deriv();
    11091109    else {
    1110         CanonicalForm result = 0;
    1111         for ( CFIterator i = *this; i.hasTerms(); i++ )
    1112             result += i.coeff().deriv( x ) * power( y, i.exp() );
    1113         return result;
     1110        CanonicalForm result = 0;
     1111        for ( CFIterator i = *this; i.hasTerms(); i++ )
     1112            result += i.coeff().deriv( x ) * power( y, i.exp() );
     1113        return result;
    11141114    }
    11151115}
     
    11411141{
    11421142    if ( is_imm( value ) )
    1143         return imm_sign( value );
    1144     else
    1145         return value->sign();
     1143        return imm_sign( value );
     1144    else
     1145        return value->sign();
    11461146}
    11471147//}}}
     
    11661166{
    11671167    if ( is_imm( value ) ) {
    1168         ASSERT( is_imm( value ) == INTMARK, "sqrt() not implemented" );
    1169         int n = imm2int( value );
    1170         ASSERT( n >= 0, "arg to sqrt() less than zero" );
    1171         if ( n == 0 || n == 1 )
    1172             return CanonicalForm( n );
    1173         else {
    1174             int x, y = n;
    1175             do {
    1176                 x = y;
    1177                 // the intermediate result may not fit into an
    1178                 // integer, but the result does
    1179                 y = (unsigned int)(x + n/x)/2;
    1180             } while ( y < x );
    1181             return CanonicalForm( x );
    1182         }
    1183     }
    1184     else
    1185         return CanonicalForm( value->sqrt() );
     1168        ASSERT( is_imm( value ) == INTMARK, "sqrt() not implemented" );
     1169        int n = imm2int( value );
     1170        ASSERT( n >= 0, "arg to sqrt() less than zero" );
     1171        if ( n == 0 || n == 1 )
     1172            return CanonicalForm( n );
     1173        else {
     1174            int x, y = n;
     1175            do {
     1176                x = y;
     1177                // the intermediate result may not fit into an
     1178                // integer, but the result does
     1179                y = (unsigned int)(x + n/x)/2;
     1180            } while ( y < x );
     1181            return CanonicalForm( x );
     1182        }
     1183    }
     1184    else
     1185        return CanonicalForm( value->sqrt() );
    11861186}
    11871187//}}}
     
    12021202{
    12031203    if ( is_imm( value ) ) {
    1204         ASSERT( is_imm( value ) == INTMARK, "ilog2() not implemented" );
    1205         int a = imm2int( value );
    1206         ASSERT( a > 0, "arg to ilog2() less or equal zero" );
    1207         int n = -1;
    1208         while ( a != 0 ) {
    1209             n++;
    1210             a /= 2;
    1211         }
    1212         return n;
    1213     }
    1214     else
    1215         return value->ilog2();
     1204        ASSERT( is_imm( value ) == INTMARK, "ilog2() not implemented" );
     1205        int a = imm2int( value );
     1206        ASSERT( a > 0, "arg to ilog2() less or equal zero" );
     1207        int n = -1;
     1208        while ( a != 0 ) {
     1209            n++;
     1210            a /= 2;
     1211        }
     1212        return n;
     1213    }
     1214    else
     1215        return value->ilog2();
    12161216}
    12171217//}}}
     
    12591259{
    12601260    if ( lhs.value == rhs.value )
    1261         return true;
     1261        return true;
    12621262    else if ( is_imm( rhs.value ) || is_imm( lhs.value ) ) {
    1263         ASSERT( ! is_imm( rhs.value ) ||
    1264                 ! is_imm( lhs.value ) ||
    1265                 is_imm( rhs.value ) == is_imm( lhs.value ),
    1266                 "incompatible operands" );
    1267         return false;
     1263        ASSERT( ! is_imm( rhs.value ) ||
     1264                ! is_imm( lhs.value ) ||
     1265                is_imm( rhs.value ) == is_imm( lhs.value ),
     1266                "incompatible operands" );
     1267        return false;
    12681268    }
    12691269    else  if ( lhs.value->level() != rhs.value->level() )
    1270         return false;
     1270        return false;
    12711271    else  if ( lhs.value->levelcoeff() != rhs.value->levelcoeff() )
    1272         return false;
    1273     else
    1274         return rhs.value->comparesame( lhs.value ) == 0;
     1272        return false;
     1273    else
     1274        return rhs.value->comparesame( lhs.value ) == 0;
    12751275}
    12761276
     
    12791279{
    12801280    if ( lhs.value == rhs.value )
    1281         return false;
     1281        return false;
    12821282    else if ( is_imm( rhs.value ) || is_imm( lhs.value ) ) {
    1283         ASSERT( ! is_imm( rhs.value ) ||
    1284                 ! is_imm( lhs.value ) ||
    1285                 is_imm( rhs.value ) == is_imm( lhs.value ),
    1286                 "incompatible operands" );
    1287         return true;
     1283        ASSERT( ! is_imm( rhs.value ) ||
     1284                ! is_imm( lhs.value ) ||
     1285                is_imm( rhs.value ) == is_imm( lhs.value ),
     1286                "incompatible operands" );
     1287        return true;
    12881288    }
    12891289    else  if ( lhs.value->level() != rhs.value->level() )
    1290         return true;
     1290        return true;
    12911291    else  if ( lhs.value->levelcoeff() != rhs.value->levelcoeff() )
    1292         return true;
    1293     else        return rhs.value->comparesame( lhs.value ) != 0;
     1292        return true;
     1293    else        return rhs.value->comparesame( lhs.value ) != 0;
    12941294}
    12951295//}}}
     
    13211321// w.r.t. lexicographic ordering, then f < g.  For more details,
    13221322// refer to the documentation of `InternalPoly::operator <()'.
    1323 // 
     1323//
    13241324// Both operands should have coefficients from the same base domain.
    13251325//
     
    13451345    int what = is_imm( rhs.value );
    13461346    if ( is_imm( lhs.value ) ) {
    1347         ASSERT( ! what || (what == is_imm( lhs.value )), "incompatible operands" );
    1348         if ( what == 0 )
    1349             return rhs.value->comparecoeff( lhs.value ) < 0;
    1350         else if ( what == INTMARK )
    1351             return imm_cmp( lhs.value, rhs.value ) > 0;
    1352         else if ( what == FFMARK )
    1353             return imm_cmp_p( lhs.value, rhs.value ) > 0;
    1354         else
    1355             return imm_cmp_gf( lhs.value, rhs.value ) > 0;
     1347        ASSERT( ! what || (what == is_imm( lhs.value )), "incompatible operands" );
     1348        if ( what == 0 )
     1349            return rhs.value->comparecoeff( lhs.value ) < 0;
     1350        else if ( what == INTMARK )
     1351            return imm_cmp( lhs.value, rhs.value ) > 0;
     1352        else if ( what == FFMARK )
     1353            return imm_cmp_p( lhs.value, rhs.value ) > 0;
     1354        else
     1355            return imm_cmp_gf( lhs.value, rhs.value ) > 0;
    13561356    }
    13571357    else  if ( what )
    1358         return lhs.value->comparecoeff( rhs.value ) > 0;
     1358        return lhs.value->comparecoeff( rhs.value ) > 0;
    13591359    else  if ( lhs.value->level() == rhs.value->level() )
    1360         if ( lhs.value->levelcoeff() == rhs.value->levelcoeff() )
    1361             return lhs.value->comparesame( rhs.value ) > 0;
    1362         else  if ( lhs.value->levelcoeff() > rhs.value->levelcoeff() )
    1363             return lhs.value->comparecoeff( rhs.value ) > 0;
    1364         else
    1365             return rhs.value->comparecoeff( lhs.value ) < 0;
    1366     else
    1367         return lhs.value->level() > rhs.value->level();
     1360        if ( lhs.value->levelcoeff() == rhs.value->levelcoeff() )
     1361            return lhs.value->comparesame( rhs.value ) > 0;
     1362        else  if ( lhs.value->levelcoeff() > rhs.value->levelcoeff() )
     1363            return lhs.value->comparecoeff( rhs.value ) > 0;
     1364        else
     1365            return rhs.value->comparecoeff( lhs.value ) < 0;
     1366    else
     1367        return lhs.value->level() > rhs.value->level();
    13681368}
    13691369
     
    13731373    int what = is_imm( rhs.value );
    13741374    if ( is_imm( lhs.value ) ) {
    1375         ASSERT( ! what || (what == is_imm( lhs.value )), "incompatible operands" );
    1376         if ( what == 0 )
    1377             return rhs.value->comparecoeff( lhs.value ) > 0;
    1378         else if ( what == INTMARK )
    1379             return imm_cmp( lhs.value, rhs.value ) < 0;
    1380         else if ( what == FFMARK )
    1381             return imm_cmp_p( lhs.value, rhs.value ) < 0;
    1382         else
    1383             return imm_cmp_gf( lhs.value, rhs.value ) < 0;
     1375        ASSERT( ! what || (what == is_imm( lhs.value )), "incompatible operands" );
     1376        if ( what == 0 )
     1377            return rhs.value->comparecoeff( lhs.value ) > 0;
     1378        else if ( what == INTMARK )
     1379            return imm_cmp( lhs.value, rhs.value ) < 0;
     1380        else if ( what == FFMARK )
     1381            return imm_cmp_p( lhs.value, rhs.value ) < 0;
     1382        else
     1383            return imm_cmp_gf( lhs.value, rhs.value ) < 0;
    13841384    }
    13851385    else  if ( what )
    1386         return lhs.value->comparecoeff( rhs.value ) < 0;
     1386        return lhs.value->comparecoeff( rhs.value ) < 0;
    13871387    else  if ( lhs.value->level() == rhs.value->level() )
    1388         if ( lhs.value->levelcoeff() == rhs.value->levelcoeff() )
    1389             return lhs.value->comparesame( rhs.value ) < 0;
    1390         else  if ( lhs.value->levelcoeff() > rhs.value->levelcoeff() )
    1391             return lhs.value->comparecoeff( rhs.value ) < 0;
    1392         else
    1393             return rhs.value->comparecoeff( lhs.value ) > 0;
    1394     else
    1395         return lhs.value->level() < rhs.value->level();
     1388        if ( lhs.value->levelcoeff() == rhs.value->levelcoeff() )
     1389            return lhs.value->comparesame( rhs.value ) < 0;
     1390        else  if ( lhs.value->levelcoeff() > rhs.value->levelcoeff() )
     1391            return lhs.value->comparecoeff( rhs.value ) < 0;
     1392        else
     1393            return rhs.value->comparecoeff( lhs.value ) > 0;
     1394    else
     1395        return lhs.value->level() < rhs.value->level();
    13961396}
    13971397//}}}
     
    14111411// the prime power domain.
    14121412//
    1413 // Implementation: 
     1413// Implementation:
    14141414//
    14151415// CanonicalForm::bgcd() handles the immediate case with a
     
    14381438    int what = is_imm( g.value );
    14391439    if ( is_imm( f.value ) ) {
    1440         ASSERT( ! what || (what == is_imm( f.value )), "incompatible operands" );
    1441         if ( what == 0 )
    1442             return g.value->bgcdcoeff( f.value );
    1443         else if ( what == INTMARK && ! cf_glob_switches.isOn( SW_RATIONAL ) ) {
    1444             // calculate gcd using standard integer
    1445             // arithmetic
    1446             int fInt = imm2int( f.value );
    1447             int gInt = imm2int( g.value );
    1448 
    1449             if ( fInt < 0 ) fInt = -fInt;
    1450             if ( gInt < 0 ) gInt = -gInt;
    1451             // swap fInt and gInt
    1452             if ( gInt > fInt ) {
    1453                 int swap = gInt;
    1454                 gInt = fInt;
    1455                 fInt = swap;
    1456             }
    1457 
    1458             // now, 0 <= gInt <= fInt.  Start the loop.
    1459             while ( gInt ) {
    1460                 // calculate (fInt, gInt) = (gInt, fInt%gInt)
    1461                 int r = fInt % gInt;
    1462                 fInt = gInt;
    1463                 gInt = r;
    1464             }
    1465 
    1466             return CanonicalForm( fInt );
    1467         } else
    1468             // we do not go for maximal speed for these stupid
    1469             // special cases
    1470             return CanonicalForm( f.isZero() && g.isZero() ? 0 : 1 );
     1440        ASSERT( ! what || (what == is_imm( f.value )), "incompatible operands" );
     1441        if ( what == 0 )
     1442            return g.value->bgcdcoeff( f.value );
     1443        else if ( what == INTMARK && ! cf_glob_switches.isOn( SW_RATIONAL ) ) {
     1444            // calculate gcd using standard integer
     1445            // arithmetic
     1446            int fInt = imm2int( f.value );
     1447            int gInt = imm2int( g.value );
     1448
     1449            if ( fInt < 0 ) fInt = -fInt;
     1450            if ( gInt < 0 ) gInt = -gInt;
     1451            // swap fInt and gInt
     1452            if ( gInt > fInt ) {
     1453                int swap = gInt;
     1454                gInt = fInt;
     1455                fInt = swap;
     1456            }
     1457
     1458            // now, 0 <= gInt <= fInt.  Start the loop.
     1459            while ( gInt ) {
     1460                // calculate (fInt, gInt) = (gInt, fInt%gInt)
     1461                int r = fInt % gInt;
     1462                fInt = gInt;
     1463                gInt = r;
     1464            }
     1465
     1466            return CanonicalForm( fInt );
     1467        } else
     1468            // we do not go for maximal speed for these stupid
     1469            // special cases
     1470            return CanonicalForm( f.isZero() && g.isZero() ? 0 : 1 );
    14711471    }
    14721472    else if ( what )
    1473         return f.value->bgcdcoeff( g.value );
     1473        return f.value->bgcdcoeff( g.value );
    14741474
    14751475    int fLevel = f.value->level();
     
    14781478    // check levels
    14791479    if ( fLevel == gLevel ) {
    1480         fLevel = f.value->levelcoeff();
    1481         gLevel = g.value->levelcoeff();
    1482 
    1483         // check levelcoeffs
    1484         if ( fLevel == gLevel )
    1485             return f.value->bgcdsame( g.value );
    1486         else if ( fLevel < gLevel )
    1487             return g.value->bgcdcoeff( f.value );
    1488         else
    1489             return f.value->bgcdcoeff( g.value );
     1480        fLevel = f.value->levelcoeff();
     1481        gLevel = g.value->levelcoeff();
     1482
     1483        // check levelcoeffs
     1484        if ( fLevel == gLevel )
     1485            return f.value->bgcdsame( g.value );
     1486        else if ( fLevel < gLevel )
     1487            return g.value->bgcdcoeff( f.value );
     1488        else
     1489            return f.value->bgcdcoeff( g.value );
    14901490    }
    14911491    else if ( fLevel < gLevel )
    1492         return g.value->bgcdcoeff( f.value );
    1493     else
    1494         return f.value->bgcdcoeff( g.value );
     1492        return g.value->bgcdcoeff( f.value );
     1493    else
     1494        return f.value->bgcdcoeff( g.value );
    14951495}
    14961496//}}}
     
    15081508    int what = is_imm( g.value );
    15091509    if ( is_imm( f.value ) ) {
    1510         ASSERT( ! what || (what == is_imm( f.value )), "incompatible operands" );
    1511         if ( what == 0 )
    1512             return g.value->bextgcdcoeff( f.value, b, a );
    1513         else if ( what == INTMARK && ! cf_glob_switches.isOn( SW_RATIONAL ) ) {
    1514             // calculate extended gcd using standard integer
    1515             // arithmetic
    1516             int fInt = imm2int( f.value );
    1517             int gInt = imm2int( g.value );
    1518 
    1519             // to avoid any system dpendencies with `%', we work
    1520             // with positive numbers only.  To a pity, we have to
    1521             // redo all the checks when assigning to a and b.
    1522             if ( fInt < 0 ) fInt = -fInt;
    1523             if ( gInt < 0 ) gInt = -gInt;
    1524             // swap fInt and gInt
    1525             if ( gInt > fInt ) {
    1526                 int swap = gInt;
    1527                 gInt = fInt;
    1528                 fInt = swap;
    1529             }
    1530 
    1531             int u = 1; int v = 0;
    1532             int uNext = 0; int vNext = 1;
    1533 
    1534             // at any step, we have:
    1535             // fInt_0 * u + gInt_0 * v = fInt
    1536             // fInt_0 * uNext + gInt_0 * vNext = gInt
    1537             // where fInt_0 and gInt_0 denote the values of fint
    1538             // and gInt, resp., at the beginning
    1539             while ( gInt ) {
    1540                 int r = fInt % gInt;
    1541                 int q = fInt / gInt;
    1542                 int uSwap = u - q * uNext;
    1543                 int vSwap = v - q * vNext;
    1544 
    1545                 // update variables
    1546                 fInt = gInt;
    1547                 gInt = r;
    1548                 u = uNext; v = vNext;
    1549                 uNext = uSwap; vNext = vSwap;
    1550             }
    1551 
    1552             // now, assign to a and b
    1553             int fTest = imm2int( f.value );
    1554             int gTest = imm2int( g.value );
    1555             if ( gTest > fTest ) {
    1556                 a = v; b = u;
    1557             } else {
    1558                 a = u; b = v;
    1559             }
    1560             if ( fTest < 0 ) a = -a;
    1561             if ( gTest < 0 ) b = -b;
    1562             return CanonicalForm( fInt );
    1563         } else
    1564             // stupid special cases
    1565             if ( ! f.isZero() ) {
    1566                 a = 1/f; b = 0; return CanonicalForm( 1 );
    1567             } else if ( ! g.isZero() ) {
    1568                 a = 0; b = 1/g; return CanonicalForm( 1 );
    1569             } else {
    1570                 a = 0; b = 0; return CanonicalForm( 0 );
    1571             }
     1510        ASSERT( ! what || (what == is_imm( f.value )), "incompatible operands" );
     1511        if ( what == 0 )
     1512            return g.value->bextgcdcoeff( f.value, b, a );
     1513        else if ( what == INTMARK && ! cf_glob_switches.isOn( SW_RATIONAL ) ) {
     1514            // calculate extended gcd using standard integer
     1515            // arithmetic
     1516            int fInt = imm2int( f.value );
     1517            int gInt = imm2int( g.value );
     1518
     1519            // to avoid any system dpendencies with `%', we work
     1520            // with positive numbers only.  To a pity, we have to
     1521            // redo all the checks when assigning to a and b.
     1522            if ( fInt < 0 ) fInt = -fInt;
     1523            if ( gInt < 0 ) gInt = -gInt;
     1524            // swap fInt and gInt
     1525            if ( gInt > fInt ) {
     1526                int swap = gInt;
     1527                gInt = fInt;
     1528                fInt = swap;
     1529            }
     1530
     1531            int u = 1; int v = 0;
     1532            int uNext = 0; int vNext = 1;
     1533
     1534            // at any step, we have:
     1535            // fInt_0 * u + gInt_0 * v = fInt
     1536            // fInt_0 * uNext + gInt_0 * vNext = gInt
     1537            // where fInt_0 and gInt_0 denote the values of fint
     1538            // and gInt, resp., at the beginning
     1539            while ( gInt ) {
     1540                int r = fInt % gInt;
     1541                int q = fInt / gInt;
     1542                int uSwap = u - q * uNext;
     1543                int vSwap = v - q * vNext;
     1544
     1545                // update variables
     1546                fInt = gInt;
     1547                gInt = r;
     1548                u = uNext; v = vNext;
     1549                uNext = uSwap; vNext = vSwap;
     1550            }
     1551
     1552            // now, assign to a and b
     1553            int fTest = imm2int( f.value );
     1554            int gTest = imm2int( g.value );
     1555            if ( gTest > fTest ) {
     1556                a = v; b = u;
     1557            } else {
     1558                a = u; b = v;
     1559            }
     1560            if ( fTest < 0 ) a = -a;
     1561            if ( gTest < 0 ) b = -b;
     1562            return CanonicalForm( fInt );
     1563        } else
     1564            // stupid special cases
     1565            if ( ! f.isZero() ) {
     1566                a = 1/f; b = 0; return CanonicalForm( 1 );
     1567            } else if ( ! g.isZero() ) {
     1568                a = 0; b = 1/g; return CanonicalForm( 1 );
     1569            } else {
     1570                a = 0; b = 0; return CanonicalForm( 0 );
     1571            }
    15721572    }
    15731573    else if ( what )
    1574         return f.value->bextgcdcoeff( g.value, a, b );
     1574        return f.value->bextgcdcoeff( g.value, a, b );
    15751575
    15761576    int fLevel = f.value->level();
     
    15791579    // check levels
    15801580    if ( fLevel == gLevel ) {
    1581         fLevel = f.value->levelcoeff();
    1582         gLevel = g.value->levelcoeff();
    1583 
    1584         // check levelcoeffs
    1585         if ( fLevel == gLevel )
    1586             return f.value->bextgcdsame( g.value, a, b );
    1587         else if ( fLevel < gLevel )
    1588             return g.value->bextgcdcoeff( f.value, b, a );
    1589         else
    1590             return f.value->bextgcdcoeff( g.value, a, b );
     1581        fLevel = f.value->levelcoeff();
     1582        gLevel = g.value->levelcoeff();
     1583
     1584        // check levelcoeffs
     1585        if ( fLevel == gLevel )
     1586            return f.value->bextgcdsame( g.value, a, b );
     1587        else if ( fLevel < gLevel )
     1588            return g.value->bextgcdcoeff( f.value, b, a );
     1589        else
     1590            return f.value->bextgcdcoeff( g.value, a, b );
    15911591    }
    15921592    else if ( fLevel < gLevel )
    1593         return g.value->bextgcdcoeff( f.value, b, a );
    1594     else
    1595         return f.value->bextgcdcoeff( g.value, a, b );
     1593        return g.value->bextgcdcoeff( f.value, b, a );
     1594    else
     1595        return f.value->bextgcdcoeff( g.value, a, b );
    15961596}
    15971597//}}}
     
    16011601{
    16021602    if ( f.isZero() || g.isZero() )
    1603         return CanonicalForm( 0 );
     1603        return CanonicalForm( 0 );
    16041604/*
    16051605    else if (f.isOne())
     
    16091609*/
    16101610    else
    1611         return (f / bgcd( f, g )) * g;
     1611        return (f / bgcd( f, g )) * g;
    16121612}
    16131613
     
    16181618{
    16191619    if ( is_imm( value ) )
    1620         imm_print( os, value, str );
    1621     else
    1622         value->print( os, str );
     1620        imm_print( os, value, str );
     1621    else
     1622        value->print( os, str );
    16231623}
    16241624
     
    16271627{
    16281628    if ( is_imm( value ) )
    1629         imm_print( os, value, "" );
    1630     else
    1631         value->print( os, "" );
     1629        imm_print( os, value, "" );
     1630    else
     1631        value->print( os, "" );
    16321632}
    16331633
     
    16641664    int what = is_imm( value );
    16651665    if ( what == FFMARK )
    1666         return CanonicalForm( CFFactory::basic( FiniteFieldDomain, 0 ) );
     1666        return CanonicalForm( CFFactory::basic( FiniteFieldDomain, 0 ) );
    16671667    else  if ( what == GFMARK )
    1668         return CanonicalForm( CFFactory::basic( GaloisFieldDomain, 0 ) );
     1668        return CanonicalForm( CFFactory::basic( GaloisFieldDomain, 0 ) );
    16691669    else  if ( what )
    1670         return CanonicalForm( CFFactory::basic( IntegerDomain, 0 ) );
    1671     else
    1672         return CanonicalForm( value->genZero() );
     1670        return CanonicalForm( CFFactory::basic( IntegerDomain, 0 ) );
     1671    else
     1672        return CanonicalForm( value->genZero() );
    16731673}
    16741674
     
    16781678    int what = is_imm( value );
    16791679    if ( what == FFMARK )
    1680         return CanonicalForm( CFFactory::basic( FiniteFieldDomain, 1 ) );
     1680        return CanonicalForm( CFFactory::basic( FiniteFieldDomain, 1 ) );
    16811681    else  if ( what == GFMARK )
    1682         return CanonicalForm( CFFactory::basic( GaloisFieldDomain, 1 ) );
     1682        return CanonicalForm( CFFactory::basic( GaloisFieldDomain, 1 ) );
    16831683    else  if ( what )
    1684         return CanonicalForm( CFFactory::basic( IntegerDomain, 1 ) );
    1685     else
    1686         return CanonicalForm( value->genOne() );
     1684        return CanonicalForm( CFFactory::basic( IntegerDomain, 1 ) );
     1685    else
     1686        return CanonicalForm( value->genOne() );
    16871687}
    16881688//}}}
     
    16941694    ASSERT( n >= 0, "illegal exponent" );
    16951695    if ( f.isZero() || f.isOne() )
    1696         return f;
    1697     else  if ( (-f).isOne() ) {
    1698         if ( n % 2 == 0 )
    1699             return -f;
    1700         else
    1701             return f;
     1696        return f;
     1697    else  if ( (-f).isOne() )
     1698    {
     1699        if ( n % 2 == 0 )
     1700            return -f;
     1701        else
     1702            return f;
    17021703    }
    17031704    else  if ( n == 0 )
    1704         return f.genOne();
     1705        return f.genOne();
    17051706    //else if (f.inGF())
    17061707    //{
    17071708    //}
    1708     else {
     1709    else
     1710    {
    17091711        CanonicalForm g,h;
    17101712        h=f;
     
    17311733    ASSERT( n >= 0, "illegal exponent" );
    17321734    if ( n == 0 )
    1733         return 1;
     1735        return 1;
    17341736    else  if ( n == 1 )
    1735         return v;
    1736     else  if ( v.level() < 0 ) {
    1737         CanonicalForm result( v, n-1 );
    1738         return result * v;
    1739     }
    1740     else
    1741         return CanonicalForm( v, n );
     1737        return v;
     1738    else  if ( v.level() < 0 )
     1739    {
     1740        CanonicalForm result( v, n-1 );
     1741        return result * v;
     1742    }
     1743    else
     1744        return CanonicalForm( v, n );
    17421745}
    17431746//}}}
  • factory/cf_gcd.cc

    rc6ed6f r094eed  
    11/* emacs edit mode for this file is -*- C++ -*- */
    2 /* $Id: cf_gcd.cc,v 1.34 2005-12-09 09:49:28 pohl Exp $ */
     2/* $Id: cf_gcd.cc,v 1.35 2005-12-09 15:00:59 Singular Exp $ */
    33
    44#include <config.h>
     
    444444#else
    445445         return N( ezgcd( M(f), M(g) ) );
    446 #endif   
     446#endif
    447447    }
    448448    else if ( isOn( SW_USE_SPARSEMOD )
     
    455455           if (si_factor_reminder)
    456456           printf("sparsemod failed, trying gcd_poly1\n");
    457            return r;
     457           return r;
    458458           //return gcd_poly1( f, g, modularflag);
    459459        }
     
    494494    }
    495495    else
     496    {
     497        ASSERT(g==0,"invalid call of cf_gcd");
    496498        if ( f.sign() < 0 )
    497499            return -f;
    498500        else
    499501            return f;
     502    }
    500503}
    501504//}}}
     
    588591{
    589592    if ( f.isZero() )
    590         if ( g.lc().sign() < 0 )
    591             return -g;
    592         else
    593             return g;
     593    {
     594      if ( g.lc().sign() < 0 )
     595        return -g;
     596      else
     597       return g;
     598    }
    594599    else  if ( g.isZero() )
    595         if ( f.lc().sign() < 0 )
    596             return -f;
    597         else
    598             return f;
     600    {
     601      if ( f.lc().sign() < 0 )
     602        return -f;
     603      else
     604        return f;
     605    }
    599606    else  if ( f.inBaseDomain() )
    600607        return bcontent( g, f );
Note: See TracChangeset for help on using the changeset viewer.