source: git/Singular/modulop.h @ e4743bc

fieker-DuValspielwiese
Last change on this file since e4743bc was 958e16, checked in by Hans Schönemann <hannes@…>, 23 years ago
*hannes: merged number-ops git-svn-id: file:///usr/local/Singular/svn/trunk@5035 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 2.8 KB
Line 
1#ifndef MODULOP_H
2#define MODULOP_H
3/****************************************
4*  Computer Algebra System SINGULAR     *
5****************************************/
6/* $Id: modulop.h,v 1.15 2001-01-09 15:40:11 Singular Exp $ */
7/*
8* ABSTRACT: numbers modulo p (<=32003)
9*/
10#include "structs.h"
11
12// define if a*b is with mod instead of tables
13#define HAVE_MULT_MOD
14
15extern int npPrimeM;
16extern int npGen;
17extern int npMapPrime;
18
19BOOLEAN npGreaterZero (number k);
20number  npMult        (number a, number b);
21number  npInit        (int i);
22int     npInt         (number &n);
23number  npAdd         (number a, number b);
24number  npSub         (number a, number b);
25void    npPower       (number a, int i, number * result);
26BOOLEAN npIsZero      (number a);
27BOOLEAN npIsOne       (number a);
28BOOLEAN npIsMOne       (number a);
29number  npDiv         (number a, number b);
30number  npNeg         (number c);
31number  npInvers      (number c);
32BOOLEAN npGreater     (number a, number b);
33BOOLEAN npEqual       (number a, number b);
34void    npWrite       (number &a);
35char *  npRead        (char *s, number *a);
36#ifdef LDEBUG
37BOOLEAN npDBTest      (number a, char *f, int l);
38#endif
39void    npSetChar(int c, ring r);
40void    npInitChar(int c, ring r);
41
42//int     npGetChar();
43
44nMapFunc npSetMap(ring src, ring dst);
45number  npMapP(number from);
46/*-------specials for spolys, do NOT use otherwise--------------------------*/
47/* for npMultM, npSubM, npNegM, npEqualM : */
48extern int npPminus1M;
49extern CARDINAL *npExpTable;
50extern CARDINAL *npLogTable;
51
52#ifdef HAVE_MULT_MOD
53inline number npMultM(number a, number b)
54{
55  return (number) 
56    ((((unsigned long) a)*((unsigned long) b)) % ((unsigned long) npPrimeM));
57}
58#else
59inline number npMultM(number a, number b)
60{
61  int x = npLogTable[(int)a]+npLogTable[(int)b];
62  return (number)npExpTable[x<npPminus1M ? x : x-npPminus1M];
63}
64#endif
65
66#if 0
67inline number npAddAsm(number a, number b, int m)
68{
69  number r;
70    asm ("addl %2, %1; cmpl %3, %1; jb 0f; subl %3, %1; 0:"
71         : "=&r" (r)
72         : "%0" (a), "g" (b), "g" (m)
73         : "cc");
74  return r;
75}
76inline number npSubAsm(number a, number b, int m)
77{
78  number r;
79  asm ("subl %2, %1; jnc 0f; addl %3, %1; 0:"
80        : "=&r" (r)
81        : "%0" (a), "g" (b), "g" (m)
82        : "cc");
83  return r;
84}
85#endif
86
87inline number npAddM(number a, number b)
88{
89  int r = (int)a + (int)b;
90  return (number)(r >= npPrimeM ? r - npPrimeM : r);
91}
92
93inline BOOLEAN npIsZeroM (number  a)
94{
95  return 0 == (int)a;
96}
97
98/*
99*inline number npMultM(number a, number b)
100*{
101*  return (number)(((int)a*(int)b) % npPrimeM);
102*}
103*/
104
105#define npSubM(a,b)    (number)((int)a<(int)b ?\
106                       npPrimeM-(int)b+(int)a : (int)a-(int)b)
107
108#define npNegM(A)      (number)(npPrimeM-(int)(A))
109#define npEqualM(A,B)  ((int)A==(int)B)
110#define npIsZeroM(a)   (0 == (int)a)
111#endif
112
Note: See TracBrowser for help on using the repository browser.