source: git/factory/ffops.cc @ 82e0a7

spielwiese
Last change on this file since 82e0a7 was 16f511, checked in by Oleksandr Motsak <motsak@…>, 11 years ago
Fixed the usage of "config.h" (if defined HAVE_CONFIG_H)
  • Property mode set to 100644
File size: 1.8 KB
Line 
1/* emacs edit mode for this file is -*- C++ -*- */
2
3#ifdef HAVE_CONFIG_H
4#include "config.h"
5#endif /* HAVE_CONFIG_H */
6
7#include <string.h>
8
9#include "cf_assert.h"
10
11#include "cf_defs.h"
12#include "ffops.h"
13
14int ff_prime = 0;
15int ff_halfprime = 0;
16bool ff_big = false;
17short * ff_invtab = new short [32767];
18
19void ff_setprime ( const int p )
20{
21    if ( p != ff_prime ) {
22        ff_prime = p;
23        ff_halfprime = ff_prime / 2;
24        if ( ! ff_big )
25            memset( ff_invtab, 0, ff_prime*sizeof(short) );
26    }
27}
28
29int ff_newinv ( const int a )
30{
31    int p, q, r1, r2, y1, y2;
32    if (a < 2)
33          return (ff_invtab[a] = a);
34    r1 = p = ff_prime;
35    q = r1 / a;
36    y1 = -q;
37    r1 -= a * q;
38    if (r1 == 1)
39    {
40      y1 += p;
41      ff_invtab[y1] = a;
42      return (ff_invtab[a] = y1);
43    }
44    r2 = a;
45    y2 = 1;
46    for (;;)
47    {
48      q = r2 / r1;
49      y2 -= y1 * q;
50      r2 -= r1 * q;
51      if (r2 == 1)
52      {
53        if (y2 < 0)
54          y2 += p;
55        ff_invtab[y2] = a;
56        return (ff_invtab[a] = y2);
57      }
58      q = r1 / r2;
59      y1 -= y2 * q;
60      r1 -= r2 * q;
61      if (r1 == 1)
62      {
63        if (y1 < 0)
64          y1 += p;
65        ff_invtab[y1] = a;
66        return (ff_invtab[a] = y1);
67      }
68    }
69}
70
71int ff_biginv ( const int a )
72{
73    int p, q, r1, r2, y1, y2;
74    if (a < 2)
75      return a;
76    r1 = p = ff_prime;
77    q = r1 / a;
78    y1 = -q;
79    r1 -= a * q;
80    if (r1 == 1)
81      return p + y1;
82    r2 = a;
83    y2 = 1;
84    for (;;)
85    {
86      q = r2 / r1;
87      y2 -= y1 * q;
88      r2 -= r1 * q;
89      if (r2 == 1)
90      {
91        if (y2 > 0)
92          return y2;
93        else
94          return p + y2;
95      }
96      q = r1 / r2;
97      y1 -= y2 * q;
98      r1 -= r2 * q;
99      if (r1 == 1)
100      {
101        if (y1 > 0)
102          return y1;
103        else
104          return p + y1;
105      }
106    }
107}
Note: See TracBrowser for help on using the repository browser.