source: git/factory/ffops.h @ 10f279

spielwiese
Last change on this file since 10f279 was 10f279, checked in by Hans Schoenemann <hannes@…>, 7 years ago
chg: FACTORY_INT64: long, if sizeof(long)==8
  • Property mode set to 100644
File size: 3.3 KB
Line 
1/* emacs edit mode for this file is -*- C++ -*- */
2
3/**
4 * @file ffops.h
5 *
6 * operations in a finite prime field F_p.
7 * The largest supported p is 536870909, i.e. the largest prime less than 2^29.
8 *
9**/
10
11#ifndef INCL_FFOPS_H
12#define INCL_FFOPS_H
13
14// #include "config.h"
15
16#include "cf_globals.h"
17#ifdef HAVE_NTL
18#include <NTL/config.h>
19#endif
20
21/* define type of your compilers 64 bit integer type */
22#ifndef FACTORY_INT64
23#if SIZEOF_LONG == 8
24#define FACTORY_INT64 long int
25#else
26#define FACTORY_INT64 long long int
27#endif
28#endif
29
30extern int ff_prime;
31extern int ff_halfprime;
32extern short * ff_invtab;
33extern bool ff_big;
34
35int ff_newinv ( const int );
36int ff_biginv ( const int );
37void ff_setprime ( const int );
38
39inline int ff_norm ( const int a )
40{
41    int n = a % ff_prime;
42#if defined(i386) || defined(NTL_AVOID_BRANCHING)
43    n += (n >> 31) & ff_prime;
44    return n;
45#else
46    if (n < 0) n += ff_prime;
47    return n;
48#endif
49}
50
51inline long ff_norm ( const long a )
52{
53    long n = a % ff_prime;
54#if defined(i386) || defined(NTL_AVOID_BRANCHING)
55    n += (n >> 31) & ff_prime;
56    return n;
57#else
58    if (n < 0) n += ff_prime;
59    return n;
60#endif
61}
62
63inline int ff_symmetric( const int a )
64{
65    if ( cf_glob_switches.isOn( SW_SYMMETRIC_FF ) )
66        return ( a > ff_halfprime ) ? a - ff_prime : a;
67    else
68        return a;
69}
70
71inline long ff_symmetric( const long a )
72{
73    if ( cf_glob_switches.isOn( SW_SYMMETRIC_FF ) )
74        return ( a > ff_halfprime ) ? a - ff_prime : a;
75    else
76        return a;
77}
78
79inline int ff_longnorm ( const long a )
80{
81    int n = (int)(a % (long)ff_prime);
82#if defined(i386) || defined(NTL_AVOID_BRANCHING)
83    n += (n >> 31) & ff_prime;
84    return n;
85#else
86    if (n < 0) n += ff_prime;
87    return n;
88#endif
89}
90
91inline int ff_bignorm ( const FACTORY_INT64 a )
92{
93    int n = (int)(a % (FACTORY_INT64)ff_prime);
94#if defined(i386) || defined(NTL_AVOID_BRANCHING)
95    n += (n >> 31) & ff_prime;
96    return n;
97#else
98    if (n < 0) n += ff_prime;
99    return n;
100#endif
101}
102
103inline int ff_add ( const int a, const int b )
104{
105    //return ff_norm( a + b );
106#if defined(i386) || defined(NTL_AVOID_BRANCHING)
107    int r=( a + b );
108    r -= ff_prime;
109    r += (r >> 31) & ff_prime;
110    return r;
111#else
112    int r=( a + b );
113    if (r >= ff_prime) r -= ff_prime;
114    return r;
115#endif
116}
117
118inline int ff_sub ( const int a, const int b )
119{
120    //return ff_norm( a - b );
121#if defined(i386) || defined(NTL_AVOID_BRANCHING)
122    int r=( a - b );
123    r += (r >> 31) & ff_prime;
124    return r;
125#else
126    int r=( a - b );
127    if (r < 0) r += ff_prime;
128    return r;
129#endif
130}
131
132inline int ff_neg ( const int a )
133{
134    //return ff_norm( -a );
135// EXPERIMENT
136#if defined(i386) || defined(NTL_AVOID_BRANCHING)
137    int r= -a;
138    r += (r >> 31) & ff_prime;
139    return r;
140#else
141    return ( a == 0 ? 0 : ff_prime-a );
142#endif
143}
144
145inline int ff_mul ( const int a, const int b )
146{
147    if ( ff_big )
148        return ff_bignorm( (FACTORY_INT64)a * (FACTORY_INT64)b );
149    else
150        return ff_longnorm ( (long)a * (long)b );
151}
152
153inline int ff_inv ( const int a )
154{
155    if ( ff_big )
156        return ff_biginv( a );
157    else {
158        register int b;
159        if ( (b = (int)(ff_invtab[a])) )
160            return b;
161        else
162            return ff_newinv( a );
163    }
164
165}
166
167inline int ff_div ( const int a, const int b )
168{
169    return ff_mul( a, ff_inv( b ) );
170}
171
172#endif /* ! INCL_FFOPS_H */
Note: See TracBrowser for help on using the repository browser.