-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsolve.py
226 lines (194 loc) · 11.1 KB
/
solve.py
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
import json
import polynomial_addition_subtraction
import polynomial_multiplication
import polynomial_long_division
import polynomial_irreducable_element_generator
import polynomial_extended_euclidean_algorithm
import polynomial_irreducability_check
import finitefield_addition_subtraction
import finitefield_division
import finitefield_inversion
import finitefield_multiplication
import finitefield_primitive_element_generator
import finitefield_primitivity_check
from Polynomial import Polynomial
def solve_exercise(exercise_location: str, answer_location: str, realScenario=True, print_correctness=True):
"""
Solves the exercise at the given location and saves the answer at the given location.
"""
# Load the exercise and return the JSON object (See Assignment 2.3)
exercise = load_exercise(exercise_location)
# Solve the exercise and returns an object with the answer(s) (see Assignment 2.4)
answer = solve(exercise)
# Save the answer
if realScenario:
save_answer(answer, answer_location, exercise["task"])
else:
answerDict = load_answer(answer_location)
if exercise['task'] == 'long_division':
if answerDict['answer-q'] == answer[0].coefficients and answerDict['answer-r'] == answer[1].coefficients:
if print_correctness:
print("Exercise solved correctly")
else:
if print_correctness:
print("Exercise solved incorrectly:")
print("Answer-q:", str(answer[0]))
print("Target answer-q:", str(answerDict['answer-q']))
print("Answer-r:", str(answer[1]))
print("Target answer-r:", str(answerDict['answer-r']))
elif exercise['task'] == 'extended_euclidean_algorithm':
if answerDict['answer-a'] == answer[1].coefficients and answerDict['answer-b'] == answer[2].coefficients and answerDict['answer-gcd'] == answer[0].coefficients:
if print_correctness:
print("Exercise solved correctly")
else:
if print_correctness:
print("Exercise solved incorrectly:")
print("Answer-a:", str(answer[1]))
print("Target answer-a:", str(answerDict['answer-a']))
print("Answer-b:", str(answer[2]))
print("Target answer-b:", str(answerDict['answer-b']))
print("Answer-gcd:", str(answer[0]))
print("Target answer-gcd:",
str(answerDict['answer-gcd']))
elif exercise['task'] == 'irreducibility_check' or exercise['task'] == 'primitivity_check':
if answerDict['answer'] == answer:
if print_correctness:
print("Exercise solved correctly")
else:
if print_correctness:
print("Exercise solved incorrectly:")
print("Answer:", str(answer))
print("Target answer:", str(answerDict['answer']))
else:
if answer == None:
if answerDict['answer'] == answer:
if print_correctness:
print("Exercise solved correctly")
else:
if print_correctness:
print("Exercise", exercise, "solved incorrectly:")
print("Answer:", str(answer))
print("Target answer:", str(answerDict['answer']))
else:
if answerDict['answer'] == answer.coefficients:
if print_correctness:
print("Exercise solved correctly")
else:
if print_correctness:
print("Exercise", exercise, "solved incorrectly:")
print("Answer:", str(answer))
print("Target answer:", str(answerDict['answer']))
def solve(exercise: dict) -> str:
"""
Solve chooses the correct solver for the chosen operation and returns the answer.
"""
# mod 0 is not defined
if exercise['integer_modulus'] == 0:
return None
match exercise:
case {'task': 'addition'}:
if (exercise['type'] == 'polynomial_arithmetic'):
return polynomial_addition_subtraction.solve_addition_polynomial_arithmetic(Polynomial(exercise['integer_modulus'], exercise['f']), Polynomial(exercise['integer_modulus'], exercise['g']))
if (exercise['type'] == "finite_field_arithmetic"):
return finitefield_addition_subtraction.solve_addition_finite_field_arithmetic(Polynomial(exercise['integer_modulus'], exercise['f']), Polynomial(exercise['integer_modulus'], exercise['g']), Polynomial(exercise['integer_modulus'], exercise['polynomial_modulus']))
case {'task': 'subtraction'}:
if (exercise['type'] == 'polynomial_arithmetic'):
return polynomial_addition_subtraction.solve_subtraction_polynomial_arithmetic(Polynomial(exercise['integer_modulus'], exercise['f']), Polynomial(exercise['integer_modulus'], exercise['g']))
if (exercise['type'] == "finite_field_arithmetic"):
return finitefield_addition_subtraction.solve_subtraction_finite_field_arithmetic(Polynomial(exercise['integer_modulus'], exercise['f']), Polynomial(exercise['integer_modulus'], exercise['g']), Polynomial(exercise['integer_modulus'], exercise['polynomial_modulus']))
case {'task': 'multiplication'}:
if (exercise['type'] == 'polynomial_arithmetic'):
return polynomial_multiplication.solve_multiplication_polynomial_arithmetic(Polynomial(exercise['integer_modulus'], exercise['f']), Polynomial(exercise['integer_modulus'], exercise['g']))
if (exercise['type'] == "finite_field_arithmetic"):
return finitefield_multiplication.solve_multiplication_finite_field_arithmetic(Polynomial(exercise['integer_modulus'], exercise['f']), Polynomial(exercise['integer_modulus'], exercise['g']), Polynomial(exercise['integer_modulus'], exercise['polynomial_modulus']))
case {'task': 'long_division'}:
if (exercise['type'] == 'polynomial_arithmetic'):
return polynomial_long_division.solve_long_division_polynomial_arithmetic(Polynomial(exercise['integer_modulus'], exercise['f']), Polynomial(exercise['integer_modulus'], exercise['g']))
case {'task': 'extended_euclidean_algorithm'}:
if (exercise['type'] == 'polynomial_arithmetic'):
return polynomial_extended_euclidean_algorithm.solve_extended_euclidean_algorithm_polynomial_arithmetic(Polynomial(exercise['integer_modulus'], exercise['f']), Polynomial(exercise['integer_modulus'], exercise['g']))
case {'task': 'irreducibility_check'}:
if (exercise['type'] == 'polynomial_arithmetic'):
return polynomial_irreducability_check.solve_irreducability_check_polynomial_arithmetic(Polynomial(exercise['integer_modulus'], exercise['f']))
case {'task': 'irreducible_element_generation'}:
if (exercise['type'] == 'polynomial_arithmetic'):
return polynomial_irreducable_element_generator.solve_irreducable_element_generator_polynomial_arithmetic(exercise['degree'], exercise['integer_modulus'])
case {'task': 'division'}:
if (exercise['type'] == 'finite_field_arithmetic'):
return finitefield_division.solve_division_finite_field_arithmetic(Polynomial(exercise['integer_modulus'], exercise['f']), Polynomial(exercise['integer_modulus'], exercise['g']), Polynomial(exercise['integer_modulus'], exercise['polynomial_modulus']))
case {'task': 'inversion'}:
if (exercise['type'] == 'finite_field_arithmetic'):
return finitefield_inversion.solve_inversion_finite_field_arithmetic(Polynomial(exercise['integer_modulus'], exercise['f']), Polynomial(exercise['integer_modulus'], exercise['polynomial_modulus']))
case {'task': 'primitivity_check'}:
if (exercise['type'] == 'finite_field_arithmetic'):
return finitefield_primitivity_check.solve_primitivity_check_finite_field_arithmetic(Polynomial(exercise['integer_modulus'], exercise['f']), Polynomial(exercise['integer_modulus'], exercise['polynomial_modulus']))
case {'task': 'primitive_element_generation'}:
if (exercise['type'] == 'finite_field_arithmetic'):
return finitefield_primitive_element_generator.solve_primitive_element_generator_finite_field_arithmetic(Polynomial(exercise['integer_modulus'], exercise['polynomial_modulus']))
# Invalid operation
case _:
raise Exception("Invalid operation: " +
exercise["operation"] + ".")
def save_answer(answer, answer_location: str, task: str):
"""
Saves the answer at the given location.
Using the JSON format "answer": "coefficient list".
"""
# Create the answer object
if task == "extended_euclidean_algorithm":
if answer == None or answer[0] == None or answer[1] == None or answer[2] == None:
answer_object = {
"answer-a": None, "answer-b": None, "answer-gcd": None}
else:
answer_object = {
"answer-a": answer[1].coefficients, "answer-b": answer[2].coefficients, "answer-gcd": answer[0].coefficients}
elif task == "long_division":
if answer[0] == None or answer[1] == None:
answer_object = {
"answer-q": None, "answer-r": None
}
else:
answer_object = {
"answer-q": answer[0].coefficients, "answer-r": answer[1].coefficients
}
elif task == "primitivity_check" or task == "irreducibility_check":
answer_object = {"answer" : answer}
else:
if answer == None:
answer_object = {"answer" : answer}
else:
answer_object = {"answer": answer.coefficients}
# Save the answer object to a JSON file
with open(answer_location, 'w') as answer_file:
json.dump(answer_object, answer_file)
def load_exercise(exercise_location: str):
"""
Loads the exercise at the given location and returns a JSON object.
"""
# Load the exercise file
exercise = load_exercise_file(exercise_location)
# Parse the exercise
exercise = json.loads(exercise)
# Return the exercise
return exercise
def load_exercise_file(exercise_location: str):
"""
Loads the exercise at the given location.
"""
# Open the exercise file
with open(exercise_location, 'r') as exercise_file:
# Read the exercise file
exercise = exercise_file.read()
# Return the exercise
return exercise
def load_answer(answer_location: str):
"""
Loads the answer at the given location.
"""
# Open the exercise file
with open(answer_location, 'r') as answer_file:
# Read the exercise file
answer = answer_file.read()
# Return the exercise
return json.loads(answer)
# solve_exercise("Examples\Realistic\Exercises\exercise0.json", "Examples\Realistic\Exercises\\testAnswer.json")