Exemple #1
0
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()