Changeset 4df33b in git


Ignore:
Timestamp:
Sep 28, 2010, 12:19:26 PM (13 years ago)
Author:
Hans Schoenemann <hannes@…>
Branches:
(u'spielwiese', '0d6b7fcd9813a1ca1ed4220cfa2b104b97a0a003')
Children:
c94e60f986f0fb36f24beb94af60519b01cb313c
Parents:
9a24da7e54cf925089f9c1420b3c4b79dc39eea6
Message:
tr. 275: primefactors(0), primefactors(<0)

git-svn-id: file:///usr/local/Singular/svn/trunk@13295 2c84dea3-7e68-4137-9b89-c4e89433aadc
File:
1 edited

Legend:

Unmodified
Added
Removed
  • Singular/misc_ip.cc

    r9a24da r4df33b  
    5353}
    5454
    55 void divTimes_ui(mpz_t n, long d, int* times)
     55void divTimes_ui(mpz_t n, unsigned long d, int* times)
    5656{
    5757  *times = 0;
     
    6767  mpz_clear(r);
    6868  mpz_clear(q);
     69}
     70
     71static inline void divTimes_ui_ui(unsigned long *n, unsigned long d, int* times)
     72{
     73  *times = 0;
     74  unsigned long q=(*n) / d;
     75  unsigned long r=(*n) % d;
     76  while (r==0)
     77  {
     78    (*times)++;
     79    (*n)=q;
     80    q=(*n)/d; r=(*n)%d;
     81  }
    6982}
    7083
     
    180193  lists primes = (lists)omAllocBin(slists_bin); primes->Init(1000);
    181194  int* multiplicities = new int[1000];
    182 
    183   divTimes_ui(nn, 2, &tt);
    184   if (tt > 0)
    185   {
    186     setListEntry_ui(primes, index, 2);
    187     multiplicities[index++] = tt;
    188   }
    189 
    190   divTimes_ui(nn, 3, &tt);
    191   if (tt > 0)
    192   {
    193     setListEntry_ui(primes, index, 3);
    194     multiplicities[index++] = tt;
    195   }
    196 
    197   unsigned long p_ui=5; add = 2;
    198   mpz_sqrt(sr, nn);
    199   if ((mpz_cmp_ui(b, 0) == 0) || (mpz_cmp(pb, sr) > 0)) mpz_set(pb, sr);
    200   int limit=mpz_get_ui(pb);
    201   if ((limit==0)||(mpz_cmp_ui(pb,limit)!=0)) limit=1<<31;
    202   while (p_ui <=limit)
    203   {
    204     divTimes_ui(nn, p_ui, &tt);
     195  int positive=1;
     196
     197  if (!nlIsZero(n))
     198  {
     199    if (!nlGreaterZero(n))
     200    {
     201      positive=-1;
     202      mpz_neg(nn,nn);
     203    }
     204    divTimes_ui(nn, 2, &tt);
    205205    if (tt > 0)
    206206    {
    207       setListEntry_ui(primes, index, p_ui);
     207      setListEntry_ui(primes, index, 2);
    208208      multiplicities[index++] = tt;
    209       //mpz_sqrt(sr, nn);
    210       //if ((mpz_cmp_ui(b, 0) == 0) || (mpz_cmp(pb, sr) > 0)) mpz_set(pb, sr);
    211       if (mpz_size1(nn)<=2)
    212       {
     209    }
     210
     211    divTimes_ui(nn, 3, &tt);
     212    if (tt > 0)
     213    {
     214      setListEntry_ui(primes, index, 3);
     215      multiplicities[index++] = tt;
     216    }
     217
     218    unsigned long p_ui=5; add = 2;
     219    mpz_sqrt(sr, nn);
     220    if ((mpz_cmp_ui(b, 0) == 0) || (mpz_cmp(pb, sr) > 0)) mpz_set(pb, sr);
     221    int limit=mpz_get_ui(pb);
     222    if ((limit==0)||(mpz_cmp_ui(pb,limit)!=0)) limit=1<<31;
     223    while (p_ui <=limit)
     224    {
     225      divTimes_ui(nn, p_ui, &tt);
     226      if (tt > 0)
     227      {
     228        setListEntry_ui(primes, index, p_ui);
     229        multiplicities[index++] = tt;
     230        //mpz_sqrt(sr, nn);
     231        //if ((mpz_cmp_ui(b, 0) == 0) || (mpz_cmp(pb, sr) > 0)) mpz_set(pb, sr);
     232        if (mpz_size1(nn)<=2)
     233        {
     234          mpz_sqrt(sr, nn);
     235          if ((mpz_cmp_ui(b, 0) == 0) || (mpz_cmp(pb, sr) > 0)) mpz_set(pb, sr);
     236          unsigned long l=mpz_get_ui(sr);
     237          if (l<limit) limit=l;
     238          if (mpz_size1(nn)<=1)
     239          {
     240            unsigned long nn_ui=mpz_get_ui(nn);
     241            while ((p_ui <=limit)&&(nn_ui>1))
     242            {
     243              divTimes_ui_ui(&nn_ui, p_ui, &tt);
     244              if (tt > 0)
     245              {
     246                setListEntry_ui(primes, index, p_ui);
     247                multiplicities[index++] = tt;
     248                if (nn_ui>(limit/6)) limit=nn_ui/6;
     249              }
     250              p_ui +=add;
     251              add += 2; if (add == 6) add = 2;
     252            }
     253            mpz_set_ui(nn,nn_ui);
     254            break;
     255          }
     256        }
     257      }
     258      p_ui +=add;
     259      add += 2; if (add == 6) add = 2;
     260    }
     261    mpz_set_ui(p, p_ui);
     262    mpz_sqrt(sr, nn);
     263    if ((mpz_cmp_ui(b, 0) == 0) || (mpz_cmp(pb, sr) > 0)) mpz_set(pb, sr);
     264    while (mpz_cmp(pb, p) >= 0)
     265    {
     266      divTimes(nn, p, &tt);
     267      if (tt > 0)
     268      {
     269        setListEntry(primes, index, p);
     270        multiplicities[index++] = tt;
    213271        mpz_sqrt(sr, nn);
    214272        if ((mpz_cmp_ui(b, 0) == 0) || (mpz_cmp(pb, sr) > 0)) mpz_set(pb, sr);
    215         unsigned long l=mpz_get_ui(sr);
    216         if (l<limit) limit=l;
    217       }
    218     }
    219     p_ui +=add;
    220     add += 2; if (add == 6) add = 2;
    221   }
    222   mpz_set_ui(p, p_ui);
    223   mpz_sqrt(sr, nn);
    224   if ((mpz_cmp_ui(b, 0) == 0) || (mpz_cmp(pb, sr) > 0)) mpz_set(pb, sr);
    225   while (mpz_cmp(pb, p) >= 0)
    226   {
    227     divTimes(nn, p, &tt);
    228     if (tt > 0)
    229     {
    230       setListEntry(primes, index, p);
    231       multiplicities[index++] = tt;
    232       mpz_sqrt(sr, nn);
    233       if ((mpz_cmp_ui(b, 0) == 0) || (mpz_cmp(pb, sr) > 0)) mpz_set(pb, sr);
    234     }
    235     mpz_add_ui(p, p, add);
    236     add += 2; if (add == 6) add = 2;
    237   }
    238   if ((mpz_cmp_ui(nn, 1) > 0) &&
    239       ((mpz_cmp_ui(b, 0) == 0) || (mpz_cmp(nn, b) <= 0)))
    240   {
    241     setListEntry(primes, index, nn);
    242     multiplicities[index++] = 1;
    243     mpz_set_ui(nn, 1);
     273      }
     274      mpz_add_ui(p, p, add);
     275      add += 2; if (add == 6) add = 2;
     276    }
     277    if ((mpz_cmp_ui(nn, 1) > 0) &&
     278        ((mpz_cmp_ui(b, 0) == 0) || (mpz_cmp(nn, b) <= 0)))
     279    {
     280      setListEntry(primes, index, nn);
     281      multiplicities[index++] = 1;
     282      mpz_set_ui(nn, 1);
     283    }
    244284  }
    245285
     
    265305  lists L=(lists)omAllocBin(slists_bin);
    266306  L->Init(4);
     307  if (positive==-1) mpz_neg(nn,nn);
    267308  setListEntry(L, 0, nn);
    268309  L->m[1].rtyp = LIST_CMD; L->m[1].data = (void*)primesL;
Note: See TracChangeset for help on using the changeset viewer.