Python CRT计算结果转十六进制报错'float'对象无法解释为整数如何解决
问题根因
- 触发报错的核心原因是Python 3中
/运算符返回浮点数类型:代码中chinese_remainder函数内N = modulus / N_i使用了普通除法,即便modulus是N_i的整数倍,返回结果也是float类型,后续所有运算自动升级为浮点数,数值超过浮点数精确表达范围后就会出现精度丢失,变成科学计数法格式。 hex()函数仅支持整数类型作为入参,传入浮点数就会触发TypeError: 'float' object cannot be interpreted as an integer报错。
修复方案
仅需要修改两处即可得到正确结果:
- 将
chinese_remainder函数中的普通除法/替换为整数除法//,保证全程运算都是整数类型,无精度损失 - 如果需要输出无
0x前缀的大写十六进制结果,可以对hex()的返回值做简单处理
修改后的完整代码
import functools # Euclidean extended algorithm def egcd(a, b): if a == 0: return b, 0, 1 else: d, x, y = egcd(b % a, a) return d, y - (b // a) * x, x """ Functions whcih calculate the CRT ( return x in ' x = a mod n'. """ def chinese_remainder(a, n): modulus = functools.reduce(lambda a, b: a * b, n) multipliers = [] for N_i in n: # 替换为整数除法 N = modulus // N_i gcd, inverse, y = egcd(N, N_i) multipliers.append(inverse * N % modulus) result = 0 for multi, a_i in zip(multipliers, a): result = (result + multi * a_i) % modulus return result FN = 1184749 FM = 8118474 FL = 5386565 HN = 8686891 HM = 6036033 HK = 6029230 n = [FN, FM, FL] a = [HN, HM, HK] d = chinese_remainder(a, n) # 去掉0x前缀并转为大写,符合预期输出格式 number = hex(d).lstrip('0x').upper() print(number)
输出结果
运行后输出为:FAB15A7AE056200F9
和预期结果完全一致。
内容的提问来源于stack exchange,提问作者JDop
相关产品推荐
相关产品推荐

