def main(): equation = [] if not os.path.exists(dir): os.mkdir(dir) os.chdir(dir) num = int(input("请输入一共有多少个同余方程:")) with open('da ta.txt', 'w') as f: for i in range(num): equation.append(input("请输入第%d个方程:" % i) + "\n") f.write(equation[i]) else: print("目录已存在") os.chdir(dir) data = Data('./data.txt') if data.solution_judge(): print("该同余式组有解") if data.crt_judge(): print("该同余式组可以用中国剩余定理") print("解为: x=%d(mod %d)" % Crt(data).crt_compute()) else: print("该同余式组不可以用中国剩余定理,以一般方法求解") print("解为: x=%d(mod %d)" % Nst(data).nst_compute()) else: print("该同余式组无解") return False
def main(): global solution # 创建Data类实例对象 data = Data('src_data/data.txt') # 调用data对象的solution_judge方法,来判断该同余方程组是否有解 if (data.error_flag): if data.solution_judge(): print("该同余式组有解") # 如果有解,则分两种方式求解 # 先调用crt_judge方法,判断是否可以用中国剩余定理求解 if data.crt_judge(): print("该同余式组可以用中国剩余定理") sol = "解为: x=%d(mod %d)" % Crt(data).crt_compute() print(sol) # 将答案写入文件 with open("src_data/data.txt", "a") as f: f.write("\n" + sol) return sol # 如果crt_judge方法返回0,则调用nst方法,用一般求解方式进行求解 else: print("该同余式组不可以用中国剩余定理,以一般方法求解") sol = "解为: x=%d(mod %d)" % Nst(data).nst_compute() print(sol) # 将答案写入文件 with open("src_data/data.txt", "a") as f: f.write("\n" + sol) return sol else: solution = "该同余式组无解" print("该同余式组无解") return solution else: return data.solution
def nst_compute(self): for i in range(self.num_equation): a, b = prime_Decomposition(self.mod[i]) self.base2.extend(a) self.exponent.extend(b) for j in range(len(a)): self.remainder2.append(self.remainder[i]) self.num_equation2 += 1 # print("********************") # print(self.base2) # print(self.exponent) # print(self.num_equation) # print(self.num_equation2) # print("********************") for i in range(self.num_equation2): for j in range(i+1, self.num_equation2): if self.base2[i] == self.base2[j]: flag = int(self.exponent[i] > self.exponent[j]) c = [self.exponent[j], self.exponent[i]][self.exponent[j] > self.exponent[i]] b = [self.exponent[i], self.exponent[j]][self.exponent[j] > self.exponent[i]] if abs(self.remainder2[i] - self.remainder2[j]) % pow(self.base2[i], c) == 0: if flag: self.remainder3.append(self.remainder2[i]) else: self.remainder3.append(self.remainder2[j]) self.base3.append(self.base2[i]) self.exponent3.append(b) self.num_equation3 += 1 else: print("矛盾,该同余式组无解") for index, value in enumerate(self.base2): if self.base2.count(value) == 1: self.remainder3.append(self.remainder2[index]) self.base3.append(self.base2[index]) self.exponent3.append(self.exponent[index]) self.num_equation3 += 1 # print("&&&&&&&&&&&&&&&&&&&&&&") # print(self.base3) # print(self.exponent3) # print(self.num_equation3) # print(self.remainder3) # print("&&&&&&&&&&&&&&&&&&&&&&") with open("transformed_data.txt", 'w') as f: for i in range(self.num_equation3): f.write("x=%d(mod%d)\n" % (self.remainder3[i], pow(self.base3[i], self.exponent3[i]))) transformed_data = Data("./transformed_data.txt") if transformed_data.crt_judge(): print("该同余式组可以用中国剩余定理") tcrt = Crt(transformed_data) return tcrt.crt_compute() else: print("以一般方法 递归 求解") return Nst(transformed_data).nst_compute()
def nst_compute(self): # 首先对同余式方程组的模进行质数分解(调用prime_Decomposition函数) # 质数分解获得模的标准分解式,然后构成了第二套等价的方程组 for i in range(self.num_equation): a, b = prime_Decomposition(self.mod[i]) self.base2.extend(a) self.exponent.extend(b) for j in range(len(a)): self.remainder2.append(self.remainder[i]) self.num_equation2 += 1 # 双重循环遍历因数分解后的同余方程式组 # 这一步将使同余式方程组符合中国剩余定理 for i in range(self.num_equation2): for j in range(i + 1, self.num_equation2): if self.base2[i] == self.base2[j]: # flag为了标记第i项和第j项指数到底是谁比较大 flag = int(self.exponent[i] > self.exponent[j]) # c为指数较小项 # b为较大指数项 c = [self.exponent[j], self.exponent[i] ][self.exponent[j] >= self.exponent[i]] b = [self.exponent[i], self.exponent[j]][self.exponent[j] > self.exponent[i]] # 判别条件:(base^c)|余数差 if abs(self.remainder2[i] - self.remainder2[j]) % pow( self.base2[i], c) == 0: # 按条件扩充余数列表 if flag: self.remainder3.append(self.remainder2[i]) else: self.remainder3.append(self.remainder2[j]) # 按条件扩充底数,指数,并且方程个数增加一 self.base3.append(self.base2[i]) self.exponent3.append(b) self.num_equation3 += 1 else: print("矛盾,该同余式组无解") exit() # 将同余方程式组中落单的方程添加到最终方程组中 # 使用了enumerate函数,使用列表的count方法, # 若某项只出现一次,用该索引值获取该项值,并添加到相应列表中 for index, value in enumerate(self.base2): if self.base2.count(value) == 1: self.remainder3.append(self.remainder2[index]) self.base3.append(self.base2[index]) self.exponent3.append(self.exponent[index]) self.num_equation3 += 1 # 创建新文件,构造最终方程式组并将该方程式组放入txt文件中, # 这样就可以用该路径创建新的数据对象 # 到此为止,历尽千辛万苦构造的新同余式方程组就可能满足中国剩余定理了,如果满足,只要调用crt类即可 with open("src_data/transformed_data.txt", 'w') as f: for i in range(self.num_equation3): f.write("x=%d(mod%d)\n" % (self.remainder3[i], pow(self.base3[i], self.exponent3[i]))) # 构造Data对象 transformed_data = Data("src_data/transformed_data.txt") # 调用crt_judge方法,若返回1,则说明经过一轮转化已经满足中国剩余定理 if transformed_data.crt_judge(): tcrt = Crt(transformed_data) return tcrt.crt_compute() # 如果crt_judge方法返回0,则说明经过一轮转化并不转化成满足中国剩余定理形式,但已经更接近中国剩余定理条件 # 此时则需要进行递归运算,将此时的transformed_data再次传入nst,进行新的一轮三部转化 else: print("以一般方法 递归 求解") return Nst(transformed_data).nst_compute()