annotate Lib/zmod.py @ 5817:48b94de85bf3 legacy-trunk

Extensive changes by AMK.
author Guido van Rossum <guido@python.org>
date Thu, 17 Jul 1997 16:29:42 +0000
parents 683edb0c4463
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
106
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 # module 'zmod'
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 # Compute properties of mathematical "fields" formed by taking
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 # Z/n (the whole numbers modulo some whole number n) and an
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 # irreducible polynomial (i.e., a polynomial with only complex zeros),
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 # e.g., Z/5 and X**2 + 2.
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 #
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 # The field is formed by taking all possible linear combinations of
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 # a set of d base vectors (where d is the degree of the polynomial).
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 #
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 # Note that this procedure doesn't yield a field for all combinations
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 # of n and p: it may well be that some numbers have more than one
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 # inverse and others have none. This is what we check.
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 #
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 # Remember that a field is a ring where each element has an inverse.
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 # A ring has commutative addition and multiplication, a zero and a one:
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 # 0*x = x*0 = 0, 0+x = x+0 = x, 1*x = x*1 = x. Also, the distributive
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 # property holds: a*(b+c) = a*b + b*c.
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 # (XXX I forget if this is an axiom or follows from the rules.)
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
20
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 import poly
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
22
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
23
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 # Example N and polynomial
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
25
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 N = 5
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 P = poly.plus(poly.one(0, 2), poly.one(2, 1)) # 2 + x**2
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
28
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
29
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 # Return x modulo y. Returns >= 0 even if x < 0.
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 def mod(x, y):
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 return divmod(x, y)[1]
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
34
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
35
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 # Normalize a polynomial modulo n and modulo p.
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
37
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 def norm(a, n, p):
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 a = poly.modulo(a, p)
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 a = a[:]
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 for i in range(len(a)): a[i] = mod(a[i], n)
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 a = poly.normalize(a)
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 return a
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
44
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
45
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 # Make a list of all n^d elements of the proposed field.
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 def make_all(mat):
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 all = []
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 for row in mat:
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 for a in row:
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 all.append(a)
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 return all
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 def make_elements(n, d):
559
683edb0c4463 New == syntax
Guido van Rossum <guido@python.org>
parents: 106
diff changeset
56 if d == 0: return [poly.one(0, 0)]
106
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 sub = make_elements(n, d-1)
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 all = []
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 for a in sub:
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 for i in range(n):
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 all.append(poly.plus(a, poly.one(d-1, i)))
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 return all
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
63
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 def make_inv(all, n, p):
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 x = poly.one(1, 1)
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 inv = []
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 for a in all:
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 inv.append(norm(poly.times(a, x), n, p))
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 return inv
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
70
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 def checkfield(n, p):
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 all = make_elements(n, len(p)-1)
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 inv = make_inv(all, n, p)
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 all1 = all[:]
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 inv1 = inv[:]
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 all1.sort()
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 inv1.sort()
559
683edb0c4463 New == syntax
Guido van Rossum <guido@python.org>
parents: 106
diff changeset
78 if all1 == inv1: print 'BINGO!'
106
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 else:
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 print 'Sorry:', n, p
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 print all
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
82 print inv
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
83
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 def rj(s, width):
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 if type(s) <> type(''): s = `s`
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 n = len(s)
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 if n >= width: return s
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 return ' '*(width - n) + s
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
89
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
90 def lj(s, width):
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 if type(s) <> type(''): s = `s`
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 n = len(s)
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 if n >= width: return s
64373c79c099 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
94 return s + ' '*(width - n)