Changeset fc732a9 in git for factory


Ignore:
Timestamp:
Mar 17, 1998, 4:59:42 PM (26 years ago)
Author:
Jens Schmidt <schmidt@…>
Branches:
(u'spielwiese', 'd1b01e9d51ade4b46b745d3bada5c5f3696be3a8')
Children:
e0fb8d31ff69374db7f865baedfda3e614804382
Parents:
bb17e813fdec9082fa78763093e18795ea0fdbb4
Message:
***** merge from branch `factory-gcd' to main trunk


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

Legend:

Unmodified
Added
Removed
  • factory/GNUmakefile.in

    rbb17e8 rfc732a9  
    11# @configure_input@
    2 # $Id: GNUmakefile.in,v 1.31 1998-03-11 18:35:31 schmidt Exp $
     2# $Id: GNUmakefile.in,v 1.32 1998-03-17 15:59:42 schmidt Exp $
    33
    44#
     
    163163                int_cf.cc \
    164164                int_int.cc \
     165                int_intdiv.cc \
    165166                int_poly.cc \
    166167                int_pp.cc \
  • factory/int_int.cc

    rbb17e8 rfc732a9  
    11/* emacs edit mode for this file is -*- C++ -*- */
    2 /* $Id: int_int.cc,v 1.11 1998-01-22 10:54:15 schmidt Exp $ */
     2/* $Id: int_int.cc,v 1.12 1998-03-17 15:56:04 schmidt Exp $ */
    33
    44#include <config.h>
    55
    6 #include "assert.h"
    7 
    8 #include "cf_defs.h"
    9 #include "cf_globals.h"
     6#include "imm.h"
    107#include "int_int.h"
    118#include "int_rat.h"
    12 #include "imm.h"
     9#include "cf_gmp.h"
     10#include "gmpext.h"
    1311#include "canonicalform.h"
    14 #include "gmpext.h"
    15 
     12 
    1613InternalInteger::InternalInteger()
    1714{
     
    185182            return this;
    186183    }
    187 }
    188 
    189 InternalCF* InternalInteger::dividesame( InternalCF * c )
    190 {
    191     return divsame( c );
    192 }
    193 
    194 InternalCF* InternalInteger::divsame( InternalCF * c )
    195 {
    196     if ( c == this ) {
    197         if ( deleteObject() ) delete this;
    198         return CFFactory::basic( 1 );
    199     }
    200     if ( cf_glob_switches.isOn( SW_RATIONAL ) ) {
    201         MP_INT n, d;
    202         mpz_init_set( &n, &thempi );
    203         mpz_init_set( &d, &MPI( c ) );
    204         if ( deleteObject() ) delete this;
    205         InternalRational * result = new InternalRational( n, d );
    206         return result->normalize_myself();
    207     }
    208     if ( getRefCount() > 1 ) {
    209         decRefCount();
    210         MP_INT quot;
    211         MP_INT rem;
    212         int signmpi = mpz_cmp_si( &thempi, 0 );
    213         int signc = mpz_cmp_si( &MPI( c ), 0 );
    214         if ( signmpi < 0 )
    215             mpz_neg( &thempi, &thempi );
    216         if ( signc < 0 )
    217             mpz_neg( &MPI( c ), &MPI( c ) );
    218         mpz_init( &quot ); mpz_init( &rem );
    219         mpz_divmod( &quot, &rem, &thempi, &MPI( c ) );
    220         if ( signmpi < 0 )
    221             mpz_neg( &thempi, &thempi );
    222         if ( signc < 0 )
    223             mpz_neg( &MPI( c ), &MPI( c ) );
    224         if ( signmpi < 0 && signc < 0 ) {
    225             if ( mpz_cmp_si( &rem, 0 ) != 0 )
    226                 mpz_add_ui( &quot, &quot, 1 );
    227         }
    228         else  if ( signc < 0 )
    229             mpz_neg( &quot, &quot );
    230         else  if ( signmpi < 0 ) {
    231             mpz_neg( &quot, &quot );
    232             if ( mpz_cmp_si( &rem, 0 ) != 0 )
    233                 mpz_sub_ui( &quot, &quot, 1 );
    234         }
    235         mpz_clear( &rem );
    236         if ( mpz_is_imm( &quot ) ) {
    237             InternalCF * res = int2imm( mpz_get_si( &quot ) );
    238             mpz_clear( &quot );
    239             return res;
    240         }
    241         else
    242             return new InternalInteger( quot );
    243     }
    244     else {
    245         MP_INT rem;
    246         mpz_init( &rem );
    247         int signmpi = mpz_cmp_si( &thempi, 0 );
    248         int signc = mpz_cmp_si( &MPI( c ), 0 );
    249         if ( signmpi < 0 )
    250             mpz_neg( &thempi, &thempi );
    251         if ( signc < 0 )
    252             mpz_neg( &MPI( c ), &MPI( c ) );
    253         mpz_divmod( &thempi, &rem, &thempi, &MPI( c ) );
    254         if ( signc < 0 )
    255             mpz_neg( &MPI( c ), &MPI( c ) );
    256         if ( signmpi < 0 && signc < 0 ) {
    257             if ( mpz_cmp_si( &rem, 0 ) != 0 )
    258                 mpz_add_ui( &thempi, &thempi, 1 );
    259         }
    260         else  if ( signc < 0 )
    261             mpz_neg( &thempi, &thempi );
    262         else  if ( signmpi < 0 ) {
    263             mpz_neg( &thempi, &thempi );
    264             if ( mpz_cmp_si( &rem, 0 ) != 0 )
    265                 mpz_sub_ui( &thempi, &thempi, 1 );
    266         }
    267         mpz_clear( &rem );
    268         if ( mpz_is_imm( &thempi ) ) {
    269             InternalCF * res = int2imm( mpz_get_si( &thempi ) );
    270             delete this;
    271             return res;
    272         }
    273         else
    274             return this;
    275     }
    276 }
    277 
    278 InternalCF* InternalInteger::modulosame ( InternalCF * c )
    279 {
    280     return modsame( c );
    281 }
    282 
    283 InternalCF* InternalInteger::modsame( InternalCF * c )
    284 {
    285     if ( cf_glob_switches.isOn( SW_RATIONAL ) || c == this ) {
    286         if ( deleteObject() ) delete this;
    287         return CFFactory::basic( 0 );
    288     }
    289     if ( getRefCount() > 1 ) {
    290         decRefCount();
    291         MP_INT dummy;
    292         mpz_init( &dummy );
    293         int signmpi = mpz_cmp_si( &thempi, 0 );
    294         int signc = mpz_cmp_si( &MPI( c ), 0 );
    295         if ( signmpi < 0 )
    296             mpz_neg( &thempi, &thempi );
    297         if ( signc < 0 )
    298             mpz_neg( &MPI( c ), &MPI( c ) );
    299         mpz_mod( &dummy, &thempi, &MPI( c ) );
    300         if ( signmpi < 0 && mpz_cmp_si( &dummy, 0 ) != 0 ) {
    301             mpz_sub( &dummy, &MPI( c ), &dummy );
    302         }
    303         if ( signmpi < 0 )
    304             mpz_neg( &thempi, &thempi );
    305         if ( signc < 0 )
    306             mpz_neg( &MPI( c ), &MPI( c ) );
    307         if ( mpz_is_imm( &dummy ) ) {
    308             InternalCF * res = int2imm( mpz_get_si( &dummy ) );
    309             mpz_clear( &dummy );
    310             return res;
    311         }
    312         else
    313             return new InternalInteger( dummy );
    314     }
    315     else {
    316         int signmpi = mpz_cmp_si( &thempi, 0 );
    317         int signc = mpz_cmp_si( &MPI( c ), 0 );
    318         if ( signmpi < 0 )
    319             mpz_neg( &thempi, &thempi );
    320         if ( signc < 0 )
    321             mpz_neg( &MPI( c ), &MPI( c ) );
    322         mpz_mod( &thempi, &thempi, &MPI( c ) );
    323         if ( signmpi < 0 && mpz_cmp_si( &thempi, 0 ) != 0 ) {
    324             mpz_sub( &thempi, &MPI( c ), &thempi );
    325         }
    326         if ( signc < 0 )
    327             mpz_neg( &MPI( c ), &MPI( c ) );
    328         if ( mpz_is_imm( &thempi ) ) {
    329             InternalCF * res = int2imm( mpz_get_si( &thempi ) );
    330             delete this;
    331             return res;
    332         }
    333         else
    334             return this;
    335     }
    336 }
    337 
    338 void InternalInteger::divremsame( InternalCF * c, InternalCF*& quot, InternalCF*& rem )
    339 {
    340     if ( cf_glob_switches.isOn( SW_RATIONAL ) ) {
    341         quot = copyObject();
    342         quot = quot->dividesame( c );
    343         rem = CFFactory::basic( 0 );
    344     }
    345     else  if ( c == this ) {
    346         quot = CFFactory::basic( 1 );
    347         rem = CFFactory::basic( 0 );
    348     }
    349     else {
    350         MP_INT q;
    351         MP_INT r;
    352         mpz_init( &q ); mpz_init( &r );
    353         int signmpi = mpz_cmp_si( &thempi, 0 );
    354         int signc = mpz_cmp_si( &MPI( c ), 0 );
    355         if ( signmpi < 0 )
    356             mpz_neg( &thempi, &thempi );
    357         if ( signc < 0 )
    358             mpz_neg( &MPI( c ), &MPI( c ) );
    359         mpz_divmod( &q, &r, &thempi, &MPI( c ) );
    360         if ( signmpi < 0 && mpz_cmp_si( &r, 0 ) != 0 ) {
    361             mpz_sub( &r, &MPI( c ), &r );
    362         }
    363         if ( signmpi < 0 )
    364             mpz_neg( &thempi, &thempi );
    365         if ( signc < 0 )
    366             mpz_neg( &MPI( c ), &MPI( c ) );
    367         if ( signmpi < 0 && signc < 0 ) {
    368             if ( mpz_cmp_si( &r, 0 ) != 0 )
    369                 mpz_add_ui( &q, &q, 1 );
    370         }
    371         else  if ( signc < 0 )
    372             mpz_neg( &q, &q );
    373         else  if ( signmpi < 0 ) {
    374             mpz_neg( &q, &q );
    375             if ( mpz_cmp_si( &r, 0 ) != 0 )
    376                 mpz_sub_ui( &q, &q, 1 );
    377         }
    378         if ( mpz_is_imm( &q ) )
    379             quot = int2imm( mpz_get_si( &q ) );
    380         else
    381             quot = new InternalInteger( q );
    382         if ( mpz_is_imm( &r ) )
    383             rem = int2imm( mpz_get_si( &r ) );
    384         else
    385             rem = new InternalInteger( r );
    386     }
    387 }
    388 
    389 bool InternalInteger::divremsamet( InternalCF* c, InternalCF*& quot, InternalCF*& rem )
    390 {
    391     divremsame( c, quot, rem );
    392     return true;
    393184}
    394185
     
    532323            return this;
    533324    }
    534 }
    535 
    536 InternalCF* InternalInteger::dividecoeff( InternalCF* c, bool invert )
    537 {
    538     return divcoeff( c, invert );
    539 }
    540 
    541 InternalCF* InternalInteger::divcoeff( InternalCF* c, bool invert )
    542 {
    543     ASSERT( invert || ! ::is_imm( c ) || imm2int( c ) != 0, "divide by zero" );
    544     int cc = imm2int( c );
    545     if ( cf_glob_switches.isOn( SW_RATIONAL ) ) {
    546         MP_INT n, d;
    547         if ( invert ) {
    548             mpz_init_set_si( &n, cc );
    549             mpz_init_set( &d, &thempi );
    550         }
    551         else {
    552             mpz_init_set_si( &d, cc );
    553             mpz_init_set( &n, &thempi );
    554         }
    555         if ( deleteObject() ) delete this;
    556         InternalRational * result = new InternalRational( n, d );
    557         return result->normalize_myself();
    558     }
    559     ASSERT( ::is_imm( c ) == INTMARK, "incompatible base coefficients" );
    560     MP_INT quot;
    561     MP_INT rem;
    562     int signmpi = mpz_cmp_si( &thempi, 0 );
    563     int signc = cc;
    564     mpz_init( &quot ); mpz_init( &rem );
    565     if ( signmpi < 0 )
    566         mpz_neg( &thempi, &thempi );
    567     if ( signc < 0 )
    568         cc = -cc;
    569     if ( invert ) {
    570         MP_INT ccc;
    571         mpz_init_set_si( &ccc, cc );
    572         mpz_divmod( &quot, &rem, &ccc, &thempi );
    573         mpz_clear( &ccc );
    574         if ( signmpi < 0 )
    575             mpz_neg( &thempi, &thempi );
    576         if ( signmpi < 0 && signc < 0 ) {
    577             if ( mpz_cmp_si( &rem, 0 ) != 0 )
    578                 mpz_add_ui( &quot, &quot, 1 );
    579         }
    580         else  if ( signmpi < 0 )
    581             mpz_neg( &quot, &quot );
    582         else  if ( signc < 0 ) {
    583             mpz_neg( &quot, &quot );
    584             if ( mpz_cmp_si( &rem, 0 ) != 0 )
    585                 mpz_sub_ui( &quot, &quot, 1 );
    586         }
    587     }
    588     else {
    589         mpz_divmod_ui( &quot, &rem, &thempi, cc );
    590         if ( signmpi < 0 )
    591             mpz_neg( &thempi, &thempi );
    592         if ( signmpi < 0 && signc < 0 ) {
    593             if ( mpz_cmp_si( &rem, 0 ) != 0 )
    594                 mpz_add_ui( &quot, &quot, 1 );
    595         }
    596         else  if ( signc < 0 )
    597             mpz_neg( &quot, &quot );
    598         else  if ( signmpi < 0 ) {
    599             mpz_neg( &quot, &quot );
    600             if ( mpz_cmp_si( &rem, 0 ) != 0 )
    601                 mpz_sub_ui( &quot, &quot, 1 );
    602         }
    603     }
    604     mpz_clear( &rem );
    605     if ( deleteObject() ) delete this;
    606     if ( mpz_is_imm( &quot ) ) {
    607         InternalCF * res = int2imm( mpz_get_si( &quot ) );
    608         mpz_clear( &quot );
    609         return res;
    610     }
    611     else
    612         return new InternalInteger( quot );
    613 }
    614 
    615 InternalCF* InternalInteger::modulocoeff( InternalCF * c, bool invert )
    616 {
    617     return modcoeff( c, invert );
    618 }
    619 
    620 InternalCF* InternalInteger::modcoeff( InternalCF* c, bool invert )
    621 {
    622     ASSERT( ::is_imm( c ) == INTMARK, "incompatible base coefficients" );
    623     if ( cf_glob_switches.isOn( SW_RATIONAL ) ) {
    624         // in rational mode remainder is zero
    625         if ( deleteObject() ) delete this;
    626         return CFFactory::basic( 0 );
    627     }
    628     int cc = imm2int( c );
    629     MP_INT rem;
    630     int signmpi = mpz_cmp_si( &thempi, 0 );
    631     int signc = cc;
    632     mpz_init( &rem );
    633     if ( signmpi < 0 )
    634         mpz_neg( &thempi, &thempi );
    635     if ( signc < 0 )
    636         cc = -cc;
    637     if ( invert ) {
    638         MP_INT ccc;
    639         mpz_init_set_si( &ccc, cc );
    640         mpz_mod( &rem, &ccc, &thempi );
    641         mpz_clear( &ccc );
    642         if ( signc < 0 && mpz_cmp_si( &rem, 0 ) != 0 ) {
    643             mpz_sub( &rem, &thempi, &rem );
    644         }
    645         if ( signmpi < 0 )
    646             mpz_neg( &thempi, &thempi );
    647     }
    648     else {
    649         mpz_mod_ui( &rem, &thempi, cc );
    650         if ( signmpi < 0 && mpz_cmp_si( &rem, 0 ) != 0 ) {
    651             mpz_neg( &rem, &rem );
    652             mpz_add_ui( &rem, &rem, cc );
    653         }
    654         if ( signmpi < 0 )
    655             mpz_neg( &thempi, &thempi );
    656     }
    657     if ( deleteObject() ) delete this;
    658     if ( mpz_is_imm( &rem ) ) {
    659         InternalCF * res = int2imm( mpz_get_si( &rem ) );
    660         mpz_clear( &rem );
    661         return res;
    662     }
    663     else
    664         return new InternalInteger( rem );
    665 }
    666 
    667 void InternalInteger::divremcoeff( InternalCF* c, InternalCF*& quot, InternalCF*& rem, bool invert )
    668 {
    669     ASSERT( ::is_imm( c ) == INTMARK, "incompatible base coefficients" );
    670 
    671     if ( cf_glob_switches.isOn( SW_RATIONAL ) ) {
    672         quot = copyObject();
    673         quot = quot->dividecoeff( c, invert );
    674         rem = CFFactory::basic( 0 );
    675         return;
    676     }
    677     quot = copyObject();
    678     quot = quot->divcoeff( c, invert );
    679     rem = copyObject();
    680     rem = rem->modcoeff( c, invert );
    681     return;
    682     int cc = imm2int( c );
    683     MP_INT q, r;
    684     int signmpi = mpz_cmp_si( &thempi, 0 );
    685     int signc = cc;
    686 
    687     mpz_init( &q ); mpz_init( &r );
    688     if ( signmpi < 0 )
    689         mpz_neg( &thempi, &thempi );
    690     if ( signc < 0 )
    691         cc = -cc;
    692     if ( invert ) {
    693         MP_INT ccc;
    694         mpz_init_set_si( &ccc, cc );
    695         mpz_divmod( &q, &r, &ccc, &thempi );
    696         mpz_clear( &ccc );
    697         if ( signc < 0 && signmpi < 0 ) {
    698             if ( mpz_cmp_si( &r, 0 ) != 0 ) {
    699                 mpz_add_ui( &q, &q, 1 );
    700                 mpz_sub( &r, &thempi, &r );
    701             }
    702         }
    703         else  if ( signc < 0 ) {
    704             if ( mpz_cmp_si( &r, 0 ) != 0 ) {
    705                 mpz_add_ui( &q, &q, 1 );
    706                 mpz_neg( &q, &q );
    707                 mpz_sub( &r, &thempi, &r );
    708             }
    709         }
    710         else  if ( signmpi < 0 )
    711             mpz_neg( &q, &q );
    712     }
    713     else {
    714         mpz_divmod_ui( &q, &r, &thempi, cc );
    715         if ( signmpi < 0 && signc < 0 ) {
    716             if ( mpz_cmp_si( &r, 0 ) != 0 ) {
    717                 mpz_add_ui( &q, &q, 1 );
    718                 mpz_neg( &r, &r );
    719                 mpz_add_ui( &r, &r, cc );
    720             }
    721         }
    722         else  if ( signmpi < 0 ) {
    723             if ( mpz_cmp_si( &r, 0 ) != 0 ) {
    724                 mpz_add_ui( &q, &q, 1 );
    725                 mpz_neg( &q, &q );
    726                 mpz_neg( &r, &r );
    727                 mpz_add_ui( &r, &r, cc );
    728             }
    729         }
    730         else  if ( signc < 0 )
    731             mpz_neg( &q, &q );
    732     }
    733     if ( signmpi < 0 )
    734         mpz_neg( &thempi, &thempi );
    735     if ( mpz_is_imm( &r ) ) {
    736         rem = int2imm( mpz_get_si( &r ) );
    737         mpz_clear( &r );
    738     }
    739     else
    740         rem = new InternalInteger( r );
    741     if ( mpz_is_imm( &q ) ) {
    742         quot = int2imm( mpz_get_si( &q ) );
    743         mpz_clear( &q );
    744     }
    745     else
    746         quot = new InternalInteger( q );
    747 }
    748 
    749 bool InternalInteger::divremcoefft( InternalCF* c, InternalCF*& quot, InternalCF*& rem, bool invert )
    750 {
    751     ASSERT( ::is_imm( c ) == INTMARK, "incompatible base coefficients" );
    752     divremcoeff( c, quot, rem, invert );
    753     return true;
    754325}
    755326
  • factory/int_int.h

    rbb17e8 rfc732a9  
    11/* emacs edit mode for this file is -*- C++ -*- */
    2 /* $Id: int_int.h,v 1.7 1998-01-22 10:54:22 schmidt Exp $ */
     2/* $Id: int_int.h,v 1.8 1998-03-17 15:56:18 schmidt Exp $ */
    33
    44#ifndef INCL_INT_INT_H
     
    77#include <config.h>
    88
    9 #include "cf_gmp.h"
    109#ifndef NOSTREAMIO
    1110#include <iostream.h>
     
    1514
    1615#include "int_cf.h"
     16#include "cf_gmp.h"
     17#include "gmpext.h"
    1718
    1819class InternalInteger : public InternalCF
     
    2021private:
    2122    MP_INT thempi;
    22     static int initialized;
    23     static MP_INT & MPI( const InternalCF * const c );
     23
     24    // auxilliary methods
     25    inline InternalCF * normalizeMyself ();
     26    inline InternalCF * uiNormalizeMyself ();
     27
     28    static inline InternalCF * normalizeMPI ( MP_INT & );
     29    static inline InternalCF * uiNormalizeMPI ( MP_INT & );
     30
     31    static inline MP_INT & MPI ( const InternalCF * const c );
     32
    2433public:
    2534    InternalInteger();
     
    95104};
    96105
    97 inline MP_INT & InternalInteger::MPI( const InternalCF * const c )
     106//{{{ inline InternalCF * InternalInteger::normalizeMyself, uiNormalizeMyself ()
     107//{{{ docu
     108//
     109// normalizeMyself(), uiNormalizeMyself() - normalize CO.
     110//
     111// If CO fits into an immediate integer, delete CO and return the
     112// immediate.  Otherwise, return a pointer to CO.
     113//
     114// `uiNormalizeMyself()' is the same as `normalizeMyself()'
     115// except that CO is expected to be non-begative.  In this case,
     116// we may use `mpz_get_ui()' to convert the underlying mpi into
     117// an immediate which is slightly faster than the signed variant.
     118//
     119// Note: We do not mind reference counting at this point!  CO is
     120// deleted unconditionally!
     121//
     122//}}}
     123inline InternalCF *
     124InternalInteger::normalizeMyself ()
     125{
     126    ASSERT( getRefCount() == 1, "internal error: must not delete CO" );
     127
     128    if ( mpz_is_imm( &thempi ) ) {
     129        InternalCF * result = int2imm( mpz_get_si( &thempi ) );
     130        delete this;
     131        return result;
     132    } else
     133        return this;
     134}
     135
     136inline InternalCF *
     137InternalInteger::uiNormalizeMyself ()
     138{
     139    ASSERT( getRefCount() == 1, "internal error: must not delete CO" );
     140
     141    if ( mpz_is_imm( &thempi ) ) {
     142        InternalCF * result = int2imm( mpz_get_ui( &thempi ) );
     143        delete this;
     144        return result;
     145    } else
     146        return this;
     147}
     148//}}}
     149
     150//{{{ static inline InternalCF * InternalInteger::normalizeMPI, uiNormalizeMPI ( MP_INT & aMpi )
     151//{{{ docu
     152//
     153// normalizeMPI(), uiNormalizeMPI() - normalize a mpi.
     154//
     155// If `aMpi' fits into an immediate integer, clear `aMpi' and
     156// return the immediate.  Otherwise, return a new
     157// `InternalInteger' with `aMpi' as underlying mpi.
     158//
     159// `uiNormalizeMPI()' is the same as `normalizeMPI()' except that
     160// `aMpi' is expected to be non-begative.  In this case, we may
     161// use `mpz_get_ui()' to convert `aMpi' into an immediate which
     162// is slightly faster than the signed variant.
     163//
     164//}}}
     165inline InternalCF *
     166InternalInteger::normalizeMPI ( MP_INT & aMpi )
     167{
     168    if ( mpz_is_imm( &aMpi ) ) {
     169        InternalCF * result = int2imm( mpz_get_si( &aMpi ) );
     170        mpz_clear( &aMpi );
     171        return result;
     172    } else
     173        return new InternalInteger( aMpi );
     174}
     175
     176inline InternalCF *
     177InternalInteger::uiNormalizeMPI ( MP_INT & aMpi )
     178{
     179    if ( mpz_is_imm( &aMpi ) ) {
     180        InternalCF * result = int2imm( mpz_get_ui( &aMpi ) );
     181        mpz_clear( &aMpi );
     182        return result;
     183    } else
     184        return new InternalInteger( aMpi );
     185}
     186//}}}
     187
     188//{{{ inline MP_INT & InternalInteger::MPI ( const InternalCF * const c )
     189//{{{ docu
     190//
     191// MPI() - return underlying mpi of `c'.
     192//
     193// `c' is expected to be an `InternalInteger *'.  `c's underlying
     194// mpi is returned.
     195//
     196//}}}
     197inline MP_INT &
     198InternalInteger::MPI ( const InternalCF * const c )
    98199{
    99200    return (((InternalInteger*)c)->thempi);
    100201}
     202//}}}
    101203
    102204#endif /* ! INCL_INT_INT_H */
  • factory/int_poly.cc

    rbb17e8 rfc732a9  
    11/* emacs edit mode for this file is -*- C++ -*- */
    2 /* $Id: int_poly.cc,v 1.9 1997-12-17 14:15:06 schmidt Exp $ */
     2/* $Id: int_poly.cc,v 1.10 1998-03-17 15:56:31 schmidt Exp $ */
    33
    44#include <config.h>
     
    828828
    829829InternalCF*
    830 InternalPoly::dividecoeff( InternalCF* c, bool invert )
    831 {
    832     return divcoeff( c, invert );
     830InternalPoly::dividecoeff( InternalCF* cc, bool invert )
     831{
     832    CanonicalForm c( is_imm(cc) ? cc : cc->copyObject() );
     833    if ( inExtension() && getReduce( var ) && invert ) {
     834        InternalCF * dummy;
     835        dummy = this->invert();
     836        dummy = dummy->mulcoeff( cc );
     837        if ( getRefCount() == 1 ) {
     838            delete this;
     839            return dummy;
     840        }
     841        else {
     842            decRefCount();
     843            return dummy;
     844        }
     845    }
     846    if ( invert )
     847        if ( getRefCount() == 1 ) {
     848            delete this;
     849            return CFFactory::basic( 0 );
     850        }
     851        else {
     852            decRefCount();
     853            return CFFactory::basic( 0 );
     854        }
     855    if ( c.isOne() )
     856        return this;
     857    else {
     858        if ( getRefCount() == 1 ) {
     859            firstTerm = divideTermList( firstTerm, c, lastTerm );
     860            if ( firstTerm && firstTerm->exp != 0 )
     861                return this;
     862            else  if ( firstTerm ) {
     863                InternalCF * res = firstTerm->coeff.getval();
     864                delete this;
     865                return res;
     866            }
     867            else {
     868                delete this;
     869                return CFFactory::basic( 0 );
     870            }
     871        }
     872        else {
     873            decRefCount();
     874            termList last, first = copyTermList( firstTerm, last );
     875            first = divideTermList( first, c, last );
     876            if ( first && first->exp != 0 )
     877                return new InternalPoly( first, last, var );
     878            else  if ( first ) {
     879                InternalCF * res = first->coeff.getval();
     880                delete first;
     881                return res;
     882            }
     883            else {
     884                delete first;
     885                return CFFactory::basic( 0 );
     886            }
     887        }
     888    }
    833889}
    834890
     
    9801036        ASSERT( ! c.isZero(), "divide by zero!" );
    9811037        termList quotlast, quotfirst = copyTermList( firstTerm, quotlast );
    982         quotfirst = divTermList( quotfirst, c, quotlast );
     1038        quotfirst = divideTermList( quotfirst, c, quotlast );
    9831039        if ( quotfirst )
    9841040            if ( quotfirst->exp == 0 ) {
     
    12181274
    12191275termList
    1220 InternalPoly::divTermList ( termList firstTerm, const CanonicalForm& coeff, termList& lastTerm )
     1276InternalPoly::divideTermList ( termList firstTerm, const CanonicalForm& coeff, termList& lastTerm )
    12211277{
    12221278    termList theCursor = firstTerm;
     
    12261282    while ( theCursor ) {
    12271283        theCursor->coeff /= coeff;
     1284        if ( theCursor->coeff.isZero() ) {
     1285            if ( theCursor == firstTerm )
     1286                firstTerm = theCursor->next;
     1287            else
     1288                lastTerm->next = theCursor->next;
     1289            dummy = theCursor;
     1290            theCursor = theCursor->next;
     1291            delete dummy;
     1292        }
     1293        else {
     1294            lastTerm = theCursor;
     1295            theCursor = theCursor->next;
     1296        }
     1297    }
     1298    return firstTerm;
     1299}
     1300
     1301termList
     1302InternalPoly::divTermList ( termList firstTerm, const CanonicalForm& coeff, termList& lastTerm )
     1303{
     1304    termList theCursor = firstTerm;
     1305    lastTerm = 0;
     1306    termList dummy;
     1307
     1308    while ( theCursor ) {
     1309        theCursor->coeff.div( coeff );
    12281310        if ( theCursor->coeff.isZero() ) {
    12291311            if ( theCursor == firstTerm )
  • factory/int_poly.h

    rbb17e8 rfc732a9  
    11/* emacs edit mode for this file is -*- C++ -*- */
    2 /* $Id: int_poly.h,v 1.4 1997-10-10 10:36:16 schmidt Exp $ */
     2/* $Id: int_poly.h,v 1.5 1998-03-17 15:56:46 schmidt Exp $ */
    33
    44#ifndef INCL_INT_POLY_H
     
    4444    static termList addTermList ( termList, termList, termList&, bool negate );
    4545    static void mulTermList ( termList, const CanonicalForm& , const int );
     46    static termList divideTermList ( termList, const CanonicalForm&, termList& );
    4647    static termList divTermList ( termList, const CanonicalForm&, termList& );
    4748    static termList modTermList ( termList, const CanonicalForm&, termList& );
Note: See TracChangeset for help on using the changeset viewer.