aboutsummaryrefslogtreecommitdiffstats
path: root/modular.txi
blob: bf2cd52b8f5f74e483324ebf6cc4f75abbc4a10a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
@code{(require 'modular)}
@ftindex modular


@defun mod x1 x2
@defunx rem x1 x2

These procedures implement the Common-Lisp functions of the same names.
The real number @var{x2} must be non-zero.
@code{mod} returns @code{(- @var{x1} (* @var{x2} (floor (/ @var{x1} @var{x2}))))}.
@code{rem} returns @code{(- @var{x1} (* @var{x2} (truncate (/ @var{x1} @var{x2}))))}.

If @var{x1} and @var{x2} are integers, then @code{mod} behaves like
@code{modulo} and @code{rem} behaves like @code{remainder}.

@format
@t{(mod -90 360)                          @result{} 270
(rem -90 180)                          @result{} -90

(mod 540 360)                          @result{} 180
(rem 540 360)                          @result{} 180

(mod (* 5/2 pi) (* 2 pi))              @result{} 1.5707963267948965
(rem (* -5/2 pi) (* 2 pi))             @result{} -1.5707963267948965
}
@end format
@end defun


@defun extended-euclid n1 n2

Returns a list of 3 integers @code{(d x y)} such that d = gcd(@var{n1},
@var{n2}) = @var{n1} * x + @var{n2} * y.
@end defun


@defun symmetric:modulus n

Returns @code{(quotient (+ -1 n) -2)} for positive odd integer @var{n}.
@end defun


@defun modulus->integer modulus

Returns the non-negative integer characteristic of the ring formed when
@var{modulus} is used with @code{modular:} procedures.
@end defun


@defun modular:normalize modulus n

Returns the integer @code{(modulo @var{n} (modulus->integer
@var{modulus}))} in the representation specified by @var{modulus}.
@end defun

@noindent
The rest of these functions assume normalized arguments; That is, the
arguments are constrained by the following table:

@noindent
For all of these functions, if the first argument (@var{modulus}) is:
@table @code
@item positive?
Work as before.  The result is between 0 and @var{modulus}.

@item zero?
The arguments are treated as integers.  An integer is returned.

@item negative?
The arguments and result are treated as members of the integers modulo
@code{(+ 1 (* -2 @var{modulus}))}, but with @dfn{symmetric}
@cindex symmetric
representation; i.e. @code{(<= (- @var{modulus}) @var{n}
@var{modulus})}.
@end table

@noindent
If all the arguments are fixnums the computation will use only fixnums.


@defun modular:invertable? modulus k

Returns @code{#t} if there exists an integer n such that @var{k} * n
@equiv{} 1 mod @var{modulus}, and @code{#f} otherwise.
@end defun


@defun modular:invert modulus n2

Returns an integer n such that 1 = (n * @var{n2}) mod @var{modulus}.  If
@var{n2} has no inverse mod @var{modulus} an error is signaled.
@end defun


@defun modular:negate modulus n2

Returns (@minus{}@var{n2}) mod @var{modulus}.
@end defun


@defun modular:+ modulus n2 n3

Returns (@var{n2} + @var{n3}) mod @var{modulus}.
@end defun


@defun modular:- modulus n2 n3

Returns (@var{n2} @minus{} @var{n3}) mod @var{modulus}.
@end defun


@defun modular:* modulus n2 n3

Returns (@var{n2} * @var{n3}) mod @var{modulus}.

The Scheme code for @code{modular:*} with negative @var{modulus} is
not completed for fixnum-only implementations.
@end defun


@defun modular:expt modulus n2 n3

Returns (@var{n2} ^ @var{n3}) mod @var{modulus}.
@end defun