modified: makefile
[GalaxyCodeBases.git] / c_cpp / etc / calc / cal / mod.cal
blob0df617efaf0f4c7749bf03221657ade56fd40d27
1 /*
2  * mod - routines to handle numbers modulo a specified number
3  *
4  * Copyright (C) 1999  David I. Bell
5  *
6  * Calc is open software; you can redistribute it and/or modify it under
7  * the terms of the version 2.1 of the GNU Lesser General Public License
8  * as published by the Free Software Foundation.
9  *
10  * Calc is distributed in the hope that it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General
13  * Public License for more details.
14  *
15  * A copy of version 2.1 of the GNU Lesser General Public License is
16  * distributed with calc under the filename COPYING-LGPL.  You should have
17  * received a copy with calc; if not, write to Free Software Foundation, Inc.
18  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19  *
20  * @(#) $Revision: 30.1 $
21  * @(#) $Id: mod.cal,v 30.1 2007/03/16 11:09:54 chongo Exp $
22  * @(#) $Source: /usr/local/src/bin/calc/cal/RCS/mod.cal,v $
23  *
24  * Under source code control:   1990/02/15 01:50:34
25  * File existed as early as:    before 1990
26  *
27  * Share and enjoy!  :-)        http://www.isthe.com/chongo/tech/comp/calc/
28  */
31 obj mod {a};                    /* definition of the object */
33 global mod_value = 100;         /* modulus value (value of N) */
36 define lmod(a)
38         local obj mod   x;
40         if (!isreal(a) || !isint(a))
41                 quit "Bad argument for lmod function";
42         x.a = a % mod_value;
43         return x;
47 define mod_print(a)
49         if (digits(mod_value) <= 20)
50                 print a.a, "(mod", mod_value : ")" :;
51         else
52                 print a.a, "(mod N)" :;
56 define mod_one()
58         return lmod(1);
62 define mod_cmp(a, b)
64         if (isnum(a))
65                 return (a % mod_value) != b.a;
66         if (isnum(b))
67                 return (b % mod_value) != a.a;
68         return a.a != b.a;
72 define mod_rel(a, b)
74         if (isnum(a))
75                 a = lmod(a);
76         if (isnum(b))
77                 b = lmod(b);
78         if (a.a < b.a)
79                 return -1;
80         return a.a != b.a;
84 define mod_add(a, b)
86         local obj mod   x;
88         if (isnum(b)) {
89                 if (!isint(b))
90                         quit "Adding non-integer";
91                 x.a = (a.a + b) % mod_value;
92                 return x;
93         }
94         if (isnum(a)) {
95                 if (!isint(a))
96                         quit "Adding non-integer";
97                 x.a = (a + b.a) % mod_value;
98                 return x;
99         }
100         x.a = (a.a + b.a) % mod_value;
101         return x;
105 define mod_sub(a, b)
107         return a + (-b);
111 define mod_neg(a)
113         local obj mod   x;
115         x.a = mod_value - a.a;
116         return x;
120 define mod_mul(a, b)
122         local obj mod   x;
124         if (isnum(b)) {
125                 if (!isint(b))
126                         quit "Multiplying by non-integer";
127                 x.a = (a.a * b) % mod_value;
128                 return x;
129         }
130         if (isnum(a)) {
131                 if (!isint(a))
132                         quit "Multiplying by non-integer";
133                 x.a = (a * b.a) % mod_value;
134                 return x;
135         }
136         x.a = (a.a * b.a) % mod_value;
137         return x;
141 define mod_square(a)
143         local obj mod   x;
145         x.a = a.a^2 % mod_value;
146         return x;
150 define mod_inc(a)
152         local x;
154         x = a;
155         if (++x.a == mod_value)
156                 x.a = 0;
157         return x;
161 define mod_dec(a)
163         local x;
165         x = a;
166         if (--x.a < 0)
167                 x.a = mod_value - 1;
168         return x;
172 define mod_inv(a)
174         local obj mod   x;
176         x.a = minv(a.a, mod_value);
177         return x;
181 define mod_div(a, b)
183         local c;
184         local obj mod x;
185         local obj mod y;
186         if (isnum(a))
187                 a = lmod(a);
188         if (isnum(b))
189                 b = lmod(b);
190         c = gcd(a.a, b.a);
191         x.a = a.a / c;
192         y.a = b.a / c;
193         return x * inverse(y);
197 define mod_pow(a, b)
199         local x, y, z;
201         obj mod x;
202         y = a;
203         z = b;
204         if (b < 0) {
205                 y = inverse(a);
206                 z = -b;
207         }
208         x.a = pmod(y.a, z, mod_value);
209         return x;
213 if (config("resource_debug") & 3) {
214     print "obj mod {a} defined";
215     print "mod_value defined";
216     print "set mod_value as needed";