blob: ef448e6b5d105fa27b70e3fd1974d6d390637236 [file] [log] [blame]
adamantiked0f19252016-01-28 14:06:13 -03001# -*- coding: utf-8 -*-
2#
3# Copyright 2011 Sybren A. Stüvel <sybren@stuvel.eu>
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17"""Tests prime functions."""
18
19import unittest
20
21import rsa.prime
22
23
24class JacobiTest(unittest.TestCase):
25 def test_table_values(self):
26 """ Tests table of values for 1<=a<=30, 1<=b<=59, where b is odd"""
27
28 # Construct table of values, where case format is (a, b, jacobi(a, b))
29 table_values = [
30 (1, 1, 1), (1, 3, 1), (1, 5, 1), (1, 7, 1), (1, 9, 1),
31 (1, 11, 1), (1, 13, 1), (1, 15, 1), (1, 17, 1), (1, 19, 1),
32 (1, 21, 1), (1, 23, 1), (1, 25, 1), (1, 27, 1), (1, 29, 1),
33 (1, 31, 1), (1, 33, 1), (1, 35, 1), (1, 37, 1), (1, 39, 1),
34 (1, 41, 1), (1, 43, 1), (1, 45, 1), (1, 47, 1), (1, 49, 1),
35 (1, 51, 1), (1, 53, 1), (1, 55, 1), (1, 57, 1), (1, 59, 1),
36 (2, 1, 1), (2, 3, -1), (2, 5, -1), (2, 7, 1), (2, 9, 1),
37 (2, 11, -1), (2, 13, -1), (2, 15, 1), (2, 17, 1), (2, 19, -1),
38 (2, 21, -1), (2, 23, 1), (2, 25, 1), (2, 27, -1), (2, 29, -1),
39 (2, 31, 1), (2, 33, 1), (2, 35, -1), (2, 37, -1), (2, 39, 1),
40 (2, 41, 1), (2, 43, -1), (2, 45, -1), (2, 47, 1), (2, 49, 1),
41 (2, 51, -1), (2, 53, -1), (2, 55, 1), (2, 57, 1), (2, 59, -1),
42 (3, 1, 1), (3, 3, 0), (3, 5, -1), (3, 7, -1), (3, 9, 0),
43 (3, 11, 1), (3, 13, 1), (3, 15, 0), (3, 17, -1), (3, 19, -1),
44 (3, 21, 0), (3, 23, 1), (3, 25, 1), (3, 27, 0), (3, 29, -1),
45 (3, 31, -1), (3, 33, 0), (3, 35, 1), (3, 37, 1), (3, 39, 0),
46 (3, 41, -1), (3, 43, -1), (3, 45, 0), (3, 47, 1), (3, 49, 1),
47 (3, 51, 0), (3, 53, -1), (3, 55, -1), (3, 57, 0), (3, 59, 1),
48 (4, 1, 1), (4, 3, 1), (4, 5, 1), (4, 7, 1), (4, 9, 1),
49 (4, 11, 1), (4, 13, 1), (4, 15, 1), (4, 17, 1), (4, 19, 1),
50 (4, 21, 1), (4, 23, 1), (4, 25, 1), (4, 27, 1), (4, 29, 1),
51 (4, 31, 1), (4, 33, 1), (4, 35, 1), (4, 37, 1), (4, 39, 1),
52 (4, 41, 1), (4, 43, 1), (4, 45, 1), (4, 47, 1), (4, 49, 1),
53 (4, 51, 1), (4, 53, 1), (4, 55, 1), (4, 57, 1), (4, 59, 1),
54 (5, 1, 1), (5, 3, -1), (5, 5, 0), (5, 7, -1), (5, 9, 1),
55 (5, 11, 1), (5, 13, -1), (5, 15, 0), (5, 17, -1), (5, 19, 1),
56 (5, 21, 1), (5, 23, -1), (5, 25, 0), (5, 27, -1), (5, 29, 1),
57 (5, 31, 1), (5, 33, -1), (5, 35, 0), (5, 37, -1), (5, 39, 1),
58 (5, 41, 1), (5, 43, -1), (5, 45, 0), (5, 47, -1), (5, 49, 1),
59 (5, 51, 1), (5, 53, -1), (5, 55, 0), (5, 57, -1), (5, 59, 1),
60 (6, 1, 1), (6, 3, 0), (6, 5, 1), (6, 7, -1), (6, 9, 0),
61 (6, 11, -1), (6, 13, -1), (6, 15, 0), (6, 17, -1), (6, 19, 1),
62 (6, 21, 0), (6, 23, 1), (6, 25, 1), (6, 27, 0), (6, 29, 1),
63 (6, 31, -1), (6, 33, 0), (6, 35, -1), (6, 37, -1), (6, 39, 0),
64 (6, 41, -1), (6, 43, 1), (6, 45, 0), (6, 47, 1), (6, 49, 1),
65 (6, 51, 0), (6, 53, 1), (6, 55, -1), (6, 57, 0), (6, 59, -1),
66 (7, 1, 1), (7, 3, 1), (7, 5, -1), (7, 7, 0), (7, 9, 1),
67 (7, 11, -1), (7, 13, -1), (7, 15, -1), (7, 17, -1), (7, 19, 1),
68 (7, 21, 0), (7, 23, -1), (7, 25, 1), (7, 27, 1), (7, 29, 1),
69 (7, 31, 1), (7, 33, -1), (7, 35, 0), (7, 37, 1), (7, 39, -1),
70 (7, 41, -1), (7, 43, -1), (7, 45, -1), (7, 47, 1), (7, 49, 0),
71 (7, 51, -1), (7, 53, 1), (7, 55, 1), (7, 57, 1), (7, 59, 1),
72 (8, 1, 1), (8, 3, -1), (8, 5, -1), (8, 7, 1), (8, 9, 1),
73 (8, 11, -1), (8, 13, -1), (8, 15, 1), (8, 17, 1), (8, 19, -1),
74 (8, 21, -1), (8, 23, 1), (8, 25, 1), (8, 27, -1), (8, 29, -1),
75 (8, 31, 1), (8, 33, 1), (8, 35, -1), (8, 37, -1), (8, 39, 1),
76 (8, 41, 1), (8, 43, -1), (8, 45, -1), (8, 47, 1), (8, 49, 1),
77 (8, 51, -1), (8, 53, -1), (8, 55, 1), (8, 57, 1), (8, 59, -1),
78 (9, 1, 1), (9, 3, 0), (9, 5, 1), (9, 7, 1), (9, 9, 0),
79 (9, 11, 1), (9, 13, 1), (9, 15, 0), (9, 17, 1), (9, 19, 1),
80 (9, 21, 0), (9, 23, 1), (9, 25, 1), (9, 27, 0), (9, 29, 1),
81 (9, 31, 1), (9, 33, 0), (9, 35, 1), (9, 37, 1), (9, 39, 0),
82 (9, 41, 1), (9, 43, 1), (9, 45, 0), (9, 47, 1), (9, 49, 1),
83 (9, 51, 0), (9, 53, 1), (9, 55, 1), (9, 57, 0), (9, 59, 1),
84 (10, 1, 1), (10, 3, 1), (10, 5, 0), (10, 7, -1), (10, 9, 1),
85 (10, 11, -1), (10, 13, 1), (10, 15, 0), (10, 17, -1), (10, 19, -1),
86 (10, 21, -1), (10, 23, -1), (10, 25, 0), (10, 27, 1), (10, 29, -1),
87 (10, 31, 1), (10, 33, -1), (10, 35, 0), (10, 37, 1), (10, 39, 1),
88 (10, 41, 1), (10, 43, 1), (10, 45, 0), (10, 47, -1), (10, 49, 1),
89 (10, 51, -1), (10, 53, 1), (10, 55, 0), (10, 57, -1), (10, 59, -1),
90 (11, 1, 1), (11, 3, -1), (11, 5, 1), (11, 7, 1), (11, 9, 1),
91 (11, 11, 0), (11, 13, -1), (11, 15, -1), (11, 17, -1), (11, 19, 1),
92 (11, 21, -1), (11, 23, -1), (11, 25, 1), (11, 27, -1), (11, 29, -1),
93 (11, 31, -1), (11, 33, 0), (11, 35, 1), (11, 37, 1), (11, 39, 1),
94 (11, 41, -1), (11, 43, 1), (11, 45, 1), (11, 47, -1), (11, 49, 1),
95 (11, 51, 1), (11, 53, 1), (11, 55, 0), (11, 57, -1), (11, 59, -1),
96 (12, 1, 1), (12, 3, 0), (12, 5, -1), (12, 7, -1), (12, 9, 0),
97 (12, 11, 1), (12, 13, 1), (12, 15, 0), (12, 17, -1), (12, 19, -1),
98 (12, 21, 0), (12, 23, 1), (12, 25, 1), (12, 27, 0), (12, 29, -1),
99 (12, 31, -1), (12, 33, 0), (12, 35, 1), (12, 37, 1), (12, 39, 0),
100 (12, 41, -1), (12, 43, -1), (12, 45, 0), (12, 47, 1), (12, 49, 1),
101 (12, 51, 0), (12, 53, -1), (12, 55, -1), (12, 57, 0), (12, 59, 1),
102 (13, 1, 1), (13, 3, 1), (13, 5, -1), (13, 7, -1), (13, 9, 1),
103 (13, 11, -1), (13, 13, 0), (13, 15, -1), (13, 17, 1), (13, 19, -1),
104 (13, 21, -1), (13, 23, 1), (13, 25, 1), (13, 27, 1), (13, 29, 1),
105 (13, 31, -1), (13, 33, -1), (13, 35, 1), (13, 37, -1), (13, 39, 0),
106 (13, 41, -1), (13, 43, 1), (13, 45, -1), (13, 47, -1), (13, 49, 1),
107 (13, 51, 1), (13, 53, 1), (13, 55, 1), (13, 57, -1), (13, 59, -1),
108 (14, 1, 1), (14, 3, -1), (14, 5, 1), (14, 7, 0), (14, 9, 1),
109 (14, 11, 1), (14, 13, 1), (14, 15, -1), (14, 17, -1), (14, 19, -1),
110 (14, 21, 0), (14, 23, -1), (14, 25, 1), (14, 27, -1), (14, 29, -1),
111 (14, 31, 1), (14, 33, -1), (14, 35, 0), (14, 37, -1), (14, 39, -1),
112 (14, 41, -1), (14, 43, 1), (14, 45, 1), (14, 47, 1), (14, 49, 0),
113 (14, 51, 1), (14, 53, -1), (14, 55, 1), (14, 57, 1), (14, 59, -1),
114 (15, 1, 1), (15, 3, 0), (15, 5, 0), (15, 7, 1), (15, 9, 0),
115 (15, 11, 1), (15, 13, -1), (15, 15, 0), (15, 17, 1), (15, 19, -1),
116 (15, 21, 0), (15, 23, -1), (15, 25, 0), (15, 27, 0), (15, 29, -1),
117 (15, 31, -1), (15, 33, 0), (15, 35, 0), (15, 37, -1), (15, 39, 0),
118 (15, 41, -1), (15, 43, 1), (15, 45, 0), (15, 47, -1), (15, 49, 1),
119 (15, 51, 0), (15, 53, 1), (15, 55, 0), (15, 57, 0), (15, 59, 1),
120 (16, 1, 1), (16, 3, 1), (16, 5, 1), (16, 7, 1), (16, 9, 1),
121 (16, 11, 1), (16, 13, 1), (16, 15, 1), (16, 17, 1), (16, 19, 1),
122 (16, 21, 1), (16, 23, 1), (16, 25, 1), (16, 27, 1), (16, 29, 1),
123 (16, 31, 1), (16, 33, 1), (16, 35, 1), (16, 37, 1), (16, 39, 1),
124 (16, 41, 1), (16, 43, 1), (16, 45, 1), (16, 47, 1), (16, 49, 1),
125 (16, 51, 1), (16, 53, 1), (16, 55, 1), (16, 57, 1), (16, 59, 1),
126 (17, 1, 1), (17, 3, -1), (17, 5, -1), (17, 7, -1), (17, 9, 1),
127 (17, 11, -1), (17, 13, 1), (17, 15, 1), (17, 17, 0), (17, 19, 1),
128 (17, 21, 1), (17, 23, -1), (17, 25, 1), (17, 27, -1), (17, 29, -1),
129 (17, 31, -1), (17, 33, 1), (17, 35, 1), (17, 37, -1), (17, 39, -1),
130 (17, 41, -1), (17, 43, 1), (17, 45, -1), (17, 47, 1), (17, 49, 1),
131 (17, 51, 0), (17, 53, 1), (17, 55, 1), (17, 57, -1), (17, 59, 1),
132 (18, 1, 1), (18, 3, 0), (18, 5, -1), (18, 7, 1), (18, 9, 0),
133 (18, 11, -1), (18, 13, -1), (18, 15, 0), (18, 17, 1), (18, 19, -1),
134 (18, 21, 0), (18, 23, 1), (18, 25, 1), (18, 27, 0), (18, 29, -1),
135 (18, 31, 1), (18, 33, 0), (18, 35, -1), (18, 37, -1), (18, 39, 0),
136 (18, 41, 1), (18, 43, -1), (18, 45, 0), (18, 47, 1), (18, 49, 1),
137 (18, 51, 0), (18, 53, -1), (18, 55, 1), (18, 57, 0), (18, 59, -1),
138 (19, 1, 1), (19, 3, 1), (19, 5, 1), (19, 7, -1), (19, 9, 1),
139 (19, 11, -1), (19, 13, -1), (19, 15, 1), (19, 17, 1), (19, 19, 0),
140 (19, 21, -1), (19, 23, -1), (19, 25, 1), (19, 27, 1), (19, 29, -1),
141 (19, 31, 1), (19, 33, -1), (19, 35, -1), (19, 37, -1), (19, 39, -1),
142 (19, 41, -1), (19, 43, -1), (19, 45, 1), (19, 47, -1), (19, 49, 1),
143 (19, 51, 1), (19, 53, -1), (19, 55, -1), (19, 57, 0), (19, 59, 1),
144 (20, 1, 1), (20, 3, -1), (20, 5, 0), (20, 7, -1), (20, 9, 1),
145 (20, 11, 1), (20, 13, -1), (20, 15, 0), (20, 17, -1), (20, 19, 1),
146 (20, 21, 1), (20, 23, -1), (20, 25, 0), (20, 27, -1), (20, 29, 1),
147 (20, 31, 1), (20, 33, -1), (20, 35, 0), (20, 37, -1), (20, 39, 1),
148 (20, 41, 1), (20, 43, -1), (20, 45, 0), (20, 47, -1), (20, 49, 1),
149 (20, 51, 1), (20, 53, -1), (20, 55, 0), (20, 57, -1), (20, 59, 1),
150 (21, 1, 1), (21, 3, 0), (21, 5, 1), (21, 7, 0), (21, 9, 0),
151 (21, 11, -1), (21, 13, -1), (21, 15, 0), (21, 17, 1), (21, 19, -1),
152 (21, 21, 0), (21, 23, -1), (21, 25, 1), (21, 27, 0), (21, 29, -1),
153 (21, 31, -1), (21, 33, 0), (21, 35, 0), (21, 37, 1), (21, 39, 0),
154 (21, 41, 1), (21, 43, 1), (21, 45, 0), (21, 47, 1), (21, 49, 0),
155 (21, 51, 0), (21, 53, -1), (21, 55, -1), (21, 57, 0), (21, 59, 1),
156 (22, 1, 1), (22, 3, 1), (22, 5, -1), (22, 7, 1), (22, 9, 1),
157 (22, 11, 0), (22, 13, 1), (22, 15, -1), (22, 17, -1), (22, 19, -1),
158 (22, 21, 1), (22, 23, -1), (22, 25, 1), (22, 27, 1), (22, 29, 1),
159 (22, 31, -1), (22, 33, 0), (22, 35, -1), (22, 37, -1), (22, 39, 1),
160 (22, 41, -1), (22, 43, -1), (22, 45, -1), (22, 47, -1), (22, 49, 1),
161 (22, 51, -1), (22, 53, -1), (22, 55, 0), (22, 57, -1), (22, 59, 1),
162 (23, 1, 1), (23, 3, -1), (23, 5, -1), (23, 7, 1), (23, 9, 1),
163 (23, 11, 1), (23, 13, 1), (23, 15, 1), (23, 17, -1), (23, 19, 1),
164 (23, 21, -1), (23, 23, 0), (23, 25, 1), (23, 27, -1), (23, 29, 1),
165 (23, 31, -1), (23, 33, -1), (23, 35, -1), (23, 37, -1), (23, 39, -1),
166 (23, 41, 1), (23, 43, 1), (23, 45, -1), (23, 47, -1), (23, 49, 1),
167 (23, 51, 1), (23, 53, -1), (23, 55, -1), (23, 57, -1), (23, 59, -1),
168 (24, 1, 1), (24, 3, 0), (24, 5, 1), (24, 7, -1), (24, 9, 0),
169 (24, 11, -1), (24, 13, -1), (24, 15, 0), (24, 17, -1), (24, 19, 1),
170 (24, 21, 0), (24, 23, 1), (24, 25, 1), (24, 27, 0), (24, 29, 1),
171 (24, 31, -1), (24, 33, 0), (24, 35, -1), (24, 37, -1), (24, 39, 0),
172 (24, 41, -1), (24, 43, 1), (24, 45, 0), (24, 47, 1), (24, 49, 1),
173 (24, 51, 0), (24, 53, 1), (24, 55, -1), (24, 57, 0), (24, 59, -1),
174 (25, 1, 1), (25, 3, 1), (25, 5, 0), (25, 7, 1), (25, 9, 1),
175 (25, 11, 1), (25, 13, 1), (25, 15, 0), (25, 17, 1), (25, 19, 1),
176 (25, 21, 1), (25, 23, 1), (25, 25, 0), (25, 27, 1), (25, 29, 1),
177 (25, 31, 1), (25, 33, 1), (25, 35, 0), (25, 37, 1), (25, 39, 1),
178 (25, 41, 1), (25, 43, 1), (25, 45, 0), (25, 47, 1), (25, 49, 1),
179 (25, 51, 1), (25, 53, 1), (25, 55, 0), (25, 57, 1), (25, 59, 1),
180 (26, 1, 1), (26, 3, -1), (26, 5, 1), (26, 7, -1), (26, 9, 1),
181 (26, 11, 1), (26, 13, 0), (26, 15, -1), (26, 17, 1), (26, 19, 1),
182 (26, 21, 1), (26, 23, 1), (26, 25, 1), (26, 27, -1), (26, 29, -1),
183 (26, 31, -1), (26, 33, -1), (26, 35, -1), (26, 37, 1), (26, 39, 0),
184 (26, 41, -1), (26, 43, -1), (26, 45, 1), (26, 47, -1), (26, 49, 1),
185 (26, 51, -1), (26, 53, -1), (26, 55, 1), (26, 57, -1), (26, 59, 1),
186 (27, 1, 1), (27, 3, 0), (27, 5, -1), (27, 7, -1), (27, 9, 0),
187 (27, 11, 1), (27, 13, 1), (27, 15, 0), (27, 17, -1), (27, 19, -1),
188 (27, 21, 0), (27, 23, 1), (27, 25, 1), (27, 27, 0), (27, 29, -1),
189 (27, 31, -1), (27, 33, 0), (27, 35, 1), (27, 37, 1), (27, 39, 0),
190 (27, 41, -1), (27, 43, -1), (27, 45, 0), (27, 47, 1), (27, 49, 1),
191 (27, 51, 0), (27, 53, -1), (27, 55, -1), (27, 57, 0), (27, 59, 1),
192 (28, 1, 1), (28, 3, 1), (28, 5, -1), (28, 7, 0), (28, 9, 1),
193 (28, 11, -1), (28, 13, -1), (28, 15, -1), (28, 17, -1), (28, 19, 1),
194 (28, 21, 0), (28, 23, -1), (28, 25, 1), (28, 27, 1), (28, 29, 1),
195 (28, 31, 1), (28, 33, -1), (28, 35, 0), (28, 37, 1), (28, 39, -1),
196 (28, 41, -1), (28, 43, -1), (28, 45, -1), (28, 47, 1), (28, 49, 0),
197 (28, 51, -1), (28, 53, 1), (28, 55, 1), (28, 57, 1), (28, 59, 1),
198 (29, 1, 1), (29, 3, -1), (29, 5, 1), (29, 7, 1), (29, 9, 1),
199 (29, 11, -1), (29, 13, 1), (29, 15, -1), (29, 17, -1), (29, 19, -1),
200 (29, 21, -1), (29, 23, 1), (29, 25, 1), (29, 27, -1), (29, 29, 0),
201 (29, 31, -1), (29, 33, 1), (29, 35, 1), (29, 37, -1), (29, 39, -1),
202 (29, 41, -1), (29, 43, -1), (29, 45, 1), (29, 47, -1), (29, 49, 1),
203 (29, 51, 1), (29, 53, 1), (29, 55, -1), (29, 57, 1), (29, 59, 1),
204 (30, 1, 1), (30, 3, 0), (30, 5, 0), (30, 7, 1), (30, 9, 0),
205 (30, 11, -1), (30, 13, 1), (30, 15, 0), (30, 17, 1), (30, 19, 1),
206 (30, 21, 0), (30, 23, -1), (30, 25, 0), (30, 27, 0), (30, 29, 1),
207 (30, 31, -1), (30, 33, 0), (30, 35, 0), (30, 37, 1), (30, 39, 0),
208 (30, 41, -1), (30, 43, -1), (30, 45, 0), (30, 47, -1), (30, 49, 1),
209 (30, 51, 0), (30, 53, -1), (30, 55, 0), (30, 57, 0), (30, 59, -1),
210 ]
211
212 for case in table_values:
213 a, b, result = case
214 self.assertEqual(rsa.prime.jacobi(a, b), result)