Z3 SMT 求解器中的汉明权重方程
Hamming weight equation in Z3 SMT Sovler
我有一个方程组要求解,其中有一些汉明权重方程。汉明权重通常是一个数的二进制表示中 1 的个数。
我试图在 Z3 SMT Solver 中求解,但它输出一条错误消息“b'there is no current model”。我试图找到一个具有给定汉明权重和一些方程式的 32 位数字。
在下面的示例中,我试图找到一个汉明权重等于 3 的数字(0 到 2^5-1)。
from z3 import *
s = Solver()
K = [BitVec('k%d'%i,5) for i in range(3)]
Eq = [K[0]&0x1 + K[0]&0x2 + K[0]&0x4 + K[0]&0x8 + K[0]&0x10 == 3] #
s.add(Eq)
s.check()
print(s.model())
这给出错误“b'没有当前模型”。
谁能帮我解决这个问题?
编辑:
我把汉明方程弄错了;会是
Eq = [(K[0]&0x1) + ((K[0]&0x2)>>1) + ((K[0]&0x4)>>2) + ((K[0]&0x8)>>3) + ((K[0]&0x10)>>4) == 3 ]
谢谢
这是Python中的运算符优先级。这有效:
Eq = [(K[0]&0x1) + (K[0]&0x2) + (K[0]&0x4) + (K[0]&0x8) + (K[0]&0x10) == 3]
但是,您实际上并不是以这种方式计算汉明权重。每个术语都需要移动。例如。 K[0]&0x8
不是零或一,而是 0x8
或 0x0
.
我有一个方程组要求解,其中有一些汉明权重方程。汉明权重通常是一个数的二进制表示中 1 的个数。 我试图在 Z3 SMT Solver 中求解,但它输出一条错误消息“b'there is no current model”。我试图找到一个具有给定汉明权重和一些方程式的 32 位数字。
在下面的示例中,我试图找到一个汉明权重等于 3 的数字(0 到 2^5-1)。
from z3 import *
s = Solver()
K = [BitVec('k%d'%i,5) for i in range(3)]
Eq = [K[0]&0x1 + K[0]&0x2 + K[0]&0x4 + K[0]&0x8 + K[0]&0x10 == 3] #
s.add(Eq)
s.check()
print(s.model())
这给出错误“b'没有当前模型”。
谁能帮我解决这个问题?
编辑: 我把汉明方程弄错了;会是
Eq = [(K[0]&0x1) + ((K[0]&0x2)>>1) + ((K[0]&0x4)>>2) + ((K[0]&0x8)>>3) + ((K[0]&0x10)>>4) == 3 ]
谢谢
这是Python中的运算符优先级。这有效:
Eq = [(K[0]&0x1) + (K[0]&0x2) + (K[0]&0x4) + (K[0]&0x8) + (K[0]&0x10) == 3]
但是,您实际上并不是以这种方式计算汉明权重。每个术语都需要移动。例如。 K[0]&0x8
不是零或一,而是 0x8
或 0x0
.