source: git/factory/ffops.h @ 27b3cf

spielwiese
Last change on this file since 27b3cf was 27b3cf, checked in by Hans Schönemann <hannes@…>, 18 years ago
*hannes: re-use NTL optimizations git-svn-id: file:///usr/local/Singular/svn/trunk@9314 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 2.3 KB
Line 
1/* emacs edit mode for this file is -*- C++ -*- */
2/* $Id: ffops.h,v 1.10 2006-07-18 14:30:25 Singular Exp $ */
3
4#ifndef INCL_FFOPS_H
5#define INCL_FFOPS_H
6
7#include <config.h>
8
9#include "cf_globals.h"
10#ifdef HAVE_NTL
11#include <NTL/config.h>
12#endif
13
14extern int ff_prime;
15extern int ff_halfprime;
16extern short * ff_invtab;
17extern bool ff_big;
18
19int ff_newinv ( const int );
20int ff_biginv ( const int );
21void ff_setprime ( const int );
22
23inline int ff_norm ( const int a )
24{
25    int n = a % ff_prime;
26#if defined(i386) || defined(NTL_AVOID_BRANCHING)
27    n += (n >> 31) & ff_prime; 
28    return n;
29#else
30    if (n <0) n += ff_prime;
31    return n;
32#endif
33}
34
35inline int ff_symmetric( const int a )
36{
37    if ( cf_glob_switches.isOn( SW_SYMMETRIC_FF ) )
38        return ( a > ff_halfprime ) ? a - ff_prime : a;
39    else
40        return a;
41}
42
43inline int ff_longnorm ( const long a )
44{
45    int n = (int)(a % (long)ff_prime);
46#if defined(i386) || defined(NTL_AVOID_BRANCHING)
47    n += (n >> 31) & ff_prime; 
48    return n;
49#else
50    if (n <0) n += ff_prime;
51    return n;
52#endif
53}
54
55inline int ff_bignorm ( const INT64 a )
56{
57    int n = (int)(a % (INT64)ff_prime);
58    if ( n < 0 )
59        return n + ff_prime;
60    else
61        return n;
62}
63
64inline int ff_add ( const int a, const int b )
65{
66    //return ff_norm( a + b );
67#if defined(i386) || defined(NTL_AVOID_BRANCHING)
68    int r=( a + b );
69    r -= ff_prime;
70    r += (r >> 31) & ff_prime; 
71    return r;
72#else
73    int r=( a + b );
74    if (r >= ff_prime) r -= ff_prime;
75    return r;
76#endif
77}
78
79inline int ff_sub ( const int a, const int b )
80{
81    //return ff_norm( a - b );
82#if defined(i386) || defined(NTL_AVOID_BRANCHING)
83    int r=( a - b );
84    r += (r >> 31) & ff_prime; 
85    return r;
86#else
87    int r=( a - b );
88    if (r <0) r += ff_prime;
89    return r;
90#endif
91}
92
93inline int ff_neg ( const int a )
94{
95    //return ff_norm( -a );
96    return ( a == 0 ? 0 : ff_prime-a );
97}
98
99inline int ff_mul ( const int a, const int b )
100{
101    if ( ff_big )
102        return ff_bignorm( (INT64)a * (INT64)b );
103    else
104        return ff_longnorm ( (long)a * (long)b );
105}
106
107inline int ff_inv ( const int a )
108{
109    if ( ff_big )
110        return ff_biginv( a );
111    else {
112        register int b;
113        if ( (b = (int)(ff_invtab[a])) )
114            return b;
115        else
116            return ff_newinv( a );
117    }
118
119}
120
121inline int ff_div ( const int a, const int b )
122{
123    return ff_mul( a, ff_inv( b ) );
124}
125
126#endif /* ! INCL_FFOPS_H */
Note: See TracBrowser for help on using the repository browser.