2017-10-07 59 views
-1

我有这样的等式:S = val.X^3 - val.X^2 + val.X -Val数学方程

知道,所有的变量是Int64类型,和S和val是已知的值,

什么是解决这个问题的最好办法,我用numpy的和Z3,但不能得到正确的答案,任何铅将是有益的

+0

[本指南](http://ericpony.github.io/z3py-tutorial/guide-examples.htm)介绍了如何为Z3Py初始化变量。 –

回答

0

这里的适应你如何编码t他使用z3py,这个例子的目的,我把S40Val2,但你可以很容易地在下面修改这些值在相应的线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] 

这可能看起来令人惊讶,但请记住,位向量算术是模块化的;如果你进行计算,你会发现它确实满足你的方程。

+0

谢谢你的回答,我想问你一件事,我现在的主要问题是如何比较只有64位的第一位这个“Val * X * X * X-Val * X * X + Val * X-Val” – soolidsnake

+0

S/X/Val都被声明为64位量,因此它们恰好是64位。我不确定你的意思是“64位的第一位”,这就是他们的全部。 –

0

这是从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]) 
>>> 
+0

忘记第二个和最后一个部分是否定的。只要改成:'coeff = [valA,-valB,valC,-valD]' –