仅具有按位运算的两个简单表达式的相等性

时间:2014-05-17 16:53:37

标签: algorithm sha1

在C语言中给出以下两个函数:

int f(int x, int y, int z) {
    return (x & y) | ((~x) & z);
}

int g(int x, int y, int z) {
    return z ^ (x & (y ^ z));
}

对于任何有效的整数,两个函数的结果相等。

我只是想知道这两个表达式之间的数学。

我第一次在维基百科上的SHA-1算法中看到了函数f的表达式。

http://en.wikipedia.org/wiki/Sha1

在" SHA-1伪代码"部分,在主循环内:

if 0 ≤ i ≤ 19 then
        f = (b and c) or ((not b) and d)
        k = 0x5A827999
...

在一些开源实现中,它使用函数g:z ^(x&(y ^ z))中的形式。

我编写一个程序并迭代x,y,z的所有可能值,并且所有结果都相等。

如何推断表格

(x & y) | ((~x) & z) 

到表格

z ^ (x & (y ^ z))

在数学方面?不只是证明平等。

2 个答案:

答案 0 :(得分:6)

由于按位运算相当于对各个位的布尔运算,因此只需枚举{x, y, z}三元组的八个赋值即可证明等价。

填写这两个函数中的每一个的真值表,然后将八个位置相互比较。如果所有八个位置都匹配,则两个函数是等价的;否则,功能是不同的。

您无需手动执行此操作:在三个嵌套循环中插入两个函数,这些循环将xyz值从0调整为1,包括0和1比较调用f(x,y,z)g(x,y,z)的结果。

答案 1 :(得分:1)

您可以使用Karnaugh Map执行此操作。鉴于z ^ (x & (y ^ z))的{​​{3}},卡诺图是:

Karnaugh Map

可以看出,您可以从图表中创建两个组,为您提供(x & y) | (~x & z)