Changeset 30f819 in git


Ignore:
Timestamp:
Dec 9, 2017, 6:48:51 PM (6 years ago)
Author:
Christian Eder
Branches:
(u'spielwiese', '5b153614cbc72bfa198d75b1e9e33dab2645d9fe')
Children:
06468393fbc59c84e3eaa06852d8f99e75c5da27
Parents:
eece62e3bb306b45df101c601f39d368d165c99a
git-author:
Christian Eder <ederc@mathematik.uni-kl.de>2017-12-09 18:48:51+01:00
git-committer:
Christian Eder <ederc@mathematik.uni-kl.de>2018-08-16 09:52:17+02:00
Message:
adds new quotient with remainder over the integers:
tries to compute the smalles possible remainder, even if it has negative sign
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libpolys/coeffs/rintegers.cc

    reece62 r30f819  
    269269  mpz_tdiv_q(erg, (mpz_ptr) a, (mpz_ptr) b);
    270270  return (number) erg;
     271}
     272
     273static number nrzSmallestQuotRem (number a, number b, number * r, const coeffs )
     274{
     275  mpz_ptr qq = (mpz_ptr) omAllocBin(gmp_nrz_bin);
     276  mpz_init(qq);
     277  mpz_ptr rr = (mpz_ptr) omAllocBin(gmp_nrz_bin);
     278  mpz_init(rr);
     279  int gsign = mpz_sgn((mpz_ptr) b);
     280  mpz_t gg, ghalf;
     281  mpz_init(gg);
     282  mpz_init(ghalf);
     283  mpz_abs(gg, (mpz_ptr) b);
     284  mpz_fdiv_qr(qq, rr, (mpz_ptr) a, gg);
     285  mpz_tdiv_q_2exp(ghalf, gg, 1);
     286  if (mpz_cmp(rr, ghalf) > 0)  // r > ghalf
     287    {
     288      mpz_sub(rr, rr, gg);
     289      mpz_add_ui(qq, qq, 1);
     290    }
     291  if (gsign < 0) mpz_neg(qq, qq);
     292
     293  mpz_clear(gg);
     294  mpz_clear(ghalf);
     295  if (r==NULL)
     296  {
     297    mpz_clear(rr);
     298    omFreeBin(rr,gmp_nrz_bin);
     299  }
     300  else
     301  {
     302    *r=(number)rr;
     303  }
     304  return (number) qq;
    271305}
    272306
     
    620654  r->cfXExtGcd = nrzXExtGcd;
    621655  r->cfDivBy = nrzDivBy;
    622   r->cfQuotRem = nrzQuotRem;
     656  r->cfQuotRem = nrzSmallestQuotRem;
    623657  r->cfInpNeg   = nrzNeg;
    624658  r->cfInvers= nrzInvers;
     
    18571891  r->cfExtGcd = nrzExtGcd; // only for ring stuff
    18581892  r->cfXExtGcd = nrzXExtGcd; // only for ring stuff
    1859   r->cfQuotRem = nrzQuotRem;
     1893  r->cfQuotRem = nrzSmallestQuotRem;
    18601894  r->cfDivBy = nrzDivBy; // only for ring stuff
    18611895  //#endif
Note: See TracChangeset for help on using the changeset viewer.