Changeset 1e579c6 in git for kernel/rmodulo2m.cc


Ignore:
Timestamp:
Jun 20, 2007, 11:39:25 AM (17 years ago)
Author:
Oliver Wienand <wienand@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
07e8ae3b1877436cb95506c90d799438d558c703
Parents:
f7aaec31bd73e9e5b3b2bd84ee5ff4fab2de4691
Message:
kutil.cc:
* use nExtGcd, nIsUnit
* extended spolys only for non-domains

numbers.cc, numbers.h, structs.h:
* new Functions: nIsUnit, nGetUnit, nExtGcd
* new Field: the Integers

polys.cc, polys.h:
* nGetUnit hack removed
* minor memory glitch

polys1.cc:
* no pContent for Integers

ring.h:
new rField methos for Integers and p^n

rintegers.*:
implementation of the whole numbers using gmp

rmodulo*:
added funcs: nIsUnit, nGetUnit, nExtGcd


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

Legend:

Unmodified
Added
Removed
  • kernel/rmodulo2m.cc

    rf7aaec3 r1e579c6  
    22*  Computer Algebra System SINGULAR     *
    33****************************************/
    4 /* $Id: rmodulo2m.cc,v 1.11 2007-05-23 07:47:31 wienand Exp $ */
     4/* $Id: rmodulo2m.cc,v 1.12 2007-06-20 09:39:25 wienand Exp $ */
    55/*
    66* ABSTRACT: numbers modulo 2^m
     
    8080}
    8181
     82/*
     83 * Give the largest non unit k, such that a = x * k, b = y * k has
     84 * a solution.
     85 */
     86number nr2mExtGcd (number a, number b, number *s, number *t)
     87{
     88  NATNUMBER res = 0;
     89  if ((NATNUMBER) a == 0 && (NATNUMBER) b == 0) return (number) 1;
     90  while ((NATNUMBER) a % 2 == 0 && (NATNUMBER) b % 2 == 0)
     91  {
     92    a = (number) ((NATNUMBER) a / 2);
     93    b = (number) ((NATNUMBER) b / 2);
     94    res++;
     95  }
     96  if ((NATNUMBER) b % 2 == 0)
     97  {
     98    *t = NULL;
     99    *s = nr2mInvers(a);
     100    return (number) ((1L << res));// * (NATNUMBER) a);  // (2**res)*a    a ist Einheit
     101  }
     102  else
     103  {
     104    *s = NULL;
     105    *t = nr2mInvers(b);
     106    return (number) ((1L << res));// * (NATNUMBER) b);  // (2**res)*b    b ist Einheit
     107  }
     108}
     109
    82110void nr2mPower (number a, int i, number * result)
    83111{
     
    126154{
    127155  return nr2mSubM(a,b);
     156}
     157
     158BOOLEAN nr2mIsUnit (number a)
     159{
     160  return ((NATNUMBER) a % 2 == 1);
     161}
     162
     163number  nr2mGetUnit (number k)
     164{
     165  if (k == NULL)
     166    return (number) 1;
     167  NATNUMBER tmp = (NATNUMBER) k;
     168  while (tmp % 2 == 0)
     169    tmp = tmp / 2;
     170  return (number) tmp;
    128171}
    129172
     
    372415  else
    373416  {
    374     WarnS("nInitChar failed");
     417    WarnS("nInitExp failed");
    375418  }
    376419}
Note: See TracChangeset for help on using the changeset viewer.