数学方程
我有这样的等式:S = val.X^3 - val.X^2 + val.X -Val数学方程
知道,所有的变量是Int64类型,和S和val是已知的值,
什么是解决这个问题的最好办法,我用numpy的和Z3,但不能得到正确的答案,任何铅将是有益的
这里的适应你如何编码t他使用z3py,这个例子的目的,我把S
是40
和Val
是2
,但你可以很容易地在下面修改这些值在相应的线s.add
:当我运行它
from z3 import *
S = BitVec ('S', 64)
X = BitVec ('X', 64)
Val = BitVec ('Val', 64)
s = Solver()
s.add (S == 40)
s.add (Val == 2)
s.add (S == Val * X * X * X - Val * X * X + Val * X - Val)
res = s.check()
if res == sat:
print s.model()
elif res == unsat:
print "No solution"
else:
print "Solver returned: " + res
,我得到:
$ python b.py
[X = 4611686018427387907, Val = 2, S = 40]
这可能看起来令人惊讶,但请记住,位向量算术是模块化的;如果你进行计算,你会发现它确实满足你的方程。
谢谢你的回答,我想问你一件事,我现在的主要问题是如何比较只有64位的第一位这个“Val * X * X * X-Val * X * X + Val * X-Val” – soolidsnake
S/X/Val都被声明为64位量,因此它们恰好是64位。我不确定你的意思是“64位的第一位”,这就是他们的全部。 –
这是从https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.roots.html
>>> import numpy as np
>>> valA=2.1
>>> valC=4.3
>>> valD=5.4
>>> valB=3.2
>>> coeff = [valA, valB, valC, valD]
>>> np.roots(coeff)
array([-1.38548682+0.j , -0.06916135+1.36058497j,
-0.06916135-1.36058497j])
>>>
忘记第二个和最后一个部分是否定的。只要改成:'coeff = [valA,-valB,valC,-valD]' –
[本指南](http://ericpony.github.io/z3py-tutorial/guide-examples.htm)介绍了如何为Z3Py初始化变量。 –