source: git/Singular/modulop.h @ 5a1141

fieker-DuValspielwiese
Last change on this file since 5a1141 was b39d4d, checked in by Olaf Bachmann <obachman@…>, 23 years ago
Dec alpha port git-svn-id: file:///usr/local/Singular/svn/trunk@4933 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.14 2000-12-18 15:44:41 obachman 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#if defined(i386)
14// seems to be better on i386 processors
15#define HAVE_MULT_MOD
16#endif
17
18extern int npPrimeM;
19extern int npGen;
20extern int npMapPrime;
21
22BOOLEAN npGreaterZero (number k);
23number  npMult        (number a, number b);
24number  npInit        (int i);
25int     npInt         (number &n);
26number  npAdd         (number a, number b);
27number  npSub         (number a, number b);
28void    npPower       (number a, int i, number * result);
29BOOLEAN npIsZero      (number a);
30BOOLEAN npIsOne       (number a);
31BOOLEAN npIsMOne       (number a);
32number  npDiv         (number a, number b);
33number  npNeg         (number c);
34number  npInvers      (number c);
35BOOLEAN npGreater     (number a, number b);
36BOOLEAN npEqual       (number a, number b);
37void    npWrite       (number &a);
38char *  npRead        (char *s, number *a);
39#ifdef LDEBUG
40BOOLEAN npDBTest      (number a, char *f, int l);
41#endif
42void    npSetChar(int c, ring r);
43void    npInitChar(int c, ring r);
44
45//int     npGetChar();
46
47nMapFunc npSetMap(ring src, ring dst);
48number  npMapP(number from);
49/*-------specials for spolys, do NOT use otherwise--------------------------*/
50/* for npMultM, npSubM, npNegM, npEqualM : */
51extern int npPminus1M;
52extern CARDINAL *npExpTable;
53extern CARDINAL *npLogTable;
54
55#ifdef HAVE_MULT_MOD
56inline number npMultM(number a, number b)
57{
58  return (number) 
59    ((((unsigned long) a)*((unsigned long) b)) % ((unsigned long) npPrimeM));
60}
61#else
62inline number npMultM(number a, number b)
63{
64  int x = npLogTable[(int)a]+npLogTable[(int)b];
65  return (number)npExpTable[x<npPminus1M ? x : x-npPminus1M];
66}
67#endif
68
69#if 0
70inline number npAddAsm(number a, number b, int m)
71{
72  number r;
73    asm ("addl %2, %1; cmpl %3, %1; jb 0f; subl %3, %1; 0:"
74         : "=&r" (r)
75         : "%0" (a), "g" (b), "g" (m)
76         : "cc");
77  return r;
78}
79inline number npSubAsm(number a, number b, int m)
80{
81  number r;
82  asm ("subl %2, %1; jnc 0f; addl %3, %1; 0:"
83        : "=&r" (r)
84        : "%0" (a), "g" (b), "g" (m)
85        : "cc");
86  return r;
87}
88#endif
89
90inline number npAddM(number a, number b)
91{
92  int r = (int)a + (int)b;
93  return (number)(r >= npPrimeM ? r - npPrimeM : r);
94}
95
96inline BOOLEAN npIsZeroM (number  a)
97{
98  return 0 == (int)a;
99}
100
101/*
102*inline number npMultM(number a, number b)
103*{
104*  return (number)(((int)a*(int)b) % npPrimeM);
105*}
106*/
107
108#define npSubM(a,b)    (number)((int)a<(int)b ?\
109                       npPrimeM-(int)b+(int)a : (int)a-(int)b)
110
111#define npNegM(A)      (number)(npPrimeM-(int)(A))
112#define npEqualM(A,B)  ((int)A==(int)B)
113#define npIsZeroM(a)   (0 == (int)a)
114#endif
115
Note: See TracBrowser for help on using the repository browser.