XOR 的数学(算术)表示

Posted

技术标签:

【中文标题】XOR 的数学(算术)表示【英文标题】:Mathematical (Arithmetic) representation of XOR 【发布时间】:2014-02-13 02:55:26 【问题描述】:

过去 5 个小时我一直在寻找答案。尽管我找到了很多答案,但它们没有任何帮助。

我基本上在寻找的是任何 32 位无符号整数的按位 XOR 运算符的数学、仅算术表示。

尽管这听起来很简单,但没有人(至少看起来如此)设法找到这个问题的答案。

希望我们能集思广益,共同寻找解决办法。

谢谢。

【问题讨论】:

XOR using mathematical operators的可能重复 没有数学等价物,因为 XOR 是按位运算。它们与数学无关,而是与计算机处理数字的方式有关。 绝对没有重复,因为链接的线程没有提供任何有用的信息。 @Pietu:那么为什么我可以用数学模拟按位旋转?当然必须有一种方法,直到它证明它不能完成。据我所知,这尚未得到证实。 按位旋转是乘法(和除法)如何在二进制中工作的一种特殊情况,因为它的工作方式与乘/除以 2 相同。这是相同的:如果您旋转 十进制 整数左加一个0,会发生什么?它乘以 10,即基数(类似于二进制中的 2)。 【参考方案1】:

XOR 任何数字输入

a + b - ab(1 + a + b - ab)

XOR 二进制输入

a + b - 2ab(a-b)²


推导

基本逻辑运算符

NOT = (1-x)

AND = x*y

我们可以从这些运营商那里得到...

OR = (1-(1-a)(1-b)) = a + b - ab

注意:如果 a 和 b 互斥,那么它们的 and 条件将始终为零 - 从维恩图的角度来看,这意味着没有重叠。在这种情况下,我们可以写成 OR = a + b,因为 a*b = 0 对于 a & b 的所有值。


2 因子异或

定义异或为(a OR B) AND (NOT (a AND b)):

(a OR B) --> (a + b - ab)

(NOT (a AND b)) --> (1 - ab)

AND这些条件加起来就搞定了……

(a + b - ab)(1 - ab) = a + b - ab(1 + a + b - ab)

计算替代方案

如果输入值是二进制的,则可以忽略幂项以得出简化的计算等效形式。

a + b - ab(1 + a + b - ab) = a + b - ab - a²b - ab² + a²b²

如果 x 是二进制(1 或 0),那么我们可以忽略自 1² = 10² = 0 以来的幂...

a + b - ab - a²b - ab² + a²b² -- 移除权力--> a + b - 2ab

XOR (二进制) = a + b - 2ab

二进制还允许其他方程在计算上与上述方程等效。比如……

给定(a-b)² = a² + b² - 2ab

如果输入是二进制的,我们可以忽略幂,所以...

a² + b² - 2ab -- 移除权力--> a + b - 2ab

允许我们写...

XOR (二进制) = (a-b)²


多因素异或

XOR = (1 - A*B*C...)(1 - (1-A)(1-B)(1-C)...)

Excel VBA 示例...

Function ArithmeticXOR(R As Range, Optional EvaluateEquation = True)

Dim AndOfNots As String
Dim AndGate As String
For Each c In R
    AndOfNots = AndOfNots & "*(1-" & c.Address & ")"
    AndGate = AndGate & "*" & c.Address
Next
AndOfNots = Mid(AndOfNots, 2)
AndGate = Mid(AndGate, 2)

'Now all we want is (Not(AndGate) AND Not(AndOfNots))
ArithmeticXOR = "(1 - " & AndOfNots & ")*(1 - " & AndGate & ")"
If EvaluateEquation Then
    ArithmeticXOR = Application.Evaluate(xor2)
End If

End Function

k 中的任意 n

这些相同的方法可以扩展为允许 k 个条件中的任意 n 个条件为真。

例如,在三个变量 a、b 和 c 中,如果您愿意接受任何两个条件,那么您需要 a&b 或 a&c 或 b&c。这可以从复合逻辑算术建模...

(a && b) || (a && c) || (b && c) ...

并应用我们的翻译...

1 - (1-ab)(1-ac)(1-bc)...

这可以扩展到 k 个条件中的任意 n 个。有一种变量和指数组合的模式,但这会变得很长;但是,您可以通过忽略二进制上下文的幂来简化。确切的模式取决于 n 与 k 的关系。对于n = k-1,其中k是被测试条件的总数,结果如下:

c1 + c2 + c3 ... ck - n*∏

其中 c1 到 ck 都是 n 变量组合。

例如,如果满足 4 个条件中的 3 个,则为 true

abc + abe + ace + bce - 3abce

这完全合乎逻辑,因为我们所拥有的是 AND 条件的加法 OR 减去重叠的 AND 条件。

如果您开始查看 n = k-2、k-3 等。模式会变得更加复杂,因为我们要减去更多重叠。如果这完全扩展到 n = 1 的最小值,那么我们将得到一个普通的OR 条件。


思考非二进制值和模糊区域

实际的代数异或方程a + b - ab(1 + a + b - ab) 比计算等效的二元方程(如x + y - 2xy(x-y)²)复杂得多。这是否意味着什么?这种增加的复杂性有什么价值吗?

显然,为此,您必须关心离散点 (0,0)、(0,1)、(1,0) 和 (1,1) 之外的十进制值。为什么这会很重要?有时您想放松离散问题的整数约束。在这种情况下,您必须查看用于将逻辑运算符转换为方程式的前提。

在将布尔逻辑转换为算术时,您的基本构建块是 ANDNOT 运算符,您可以使用它们构建 ORXOR

OR = (1-(1-a)(1-b)(1-c)...)

XOR = (1 - a*b*c...)(1 - (1-a)(1-b)(1-c)...)

因此,如果您正在考虑小数区域,那么值得考虑一下我们如何定义这些运算符以及它们在该区域中的行为方式。

NOT 的非二进制含义

我们将NOT 表示为1-x。显然,这个简单的等式适用于 0 和 1 的二进制值,但真正酷的是它还为 0 到 1 之间的值提供小数或百分比补码。这很有用,因为 NOT 也是在布尔逻辑中称为Compliment,当涉及到集合时,NOT 指的是当前集合之外的所有内容。

AND 的非二进制含义

我们将AND 表示为x*y。再一次,显然它适用于 0 和 1,但它的效果对于 0 到 1 之间的值更加随意,其中乘法会导致部分真值(十进制值)相互递减。可以想象,您希望将真实建模为该区域的平均或累积。例如,如果两个条件假设一半为真,AND 条件是只有四分之一为真 (0.5 * 0.5),还是完全为真 (0.5 + 0.5 = 1),还是仍然半真 ((0.5 + 0.5) / 2)?事实证明,对于完全离散的条件,四分之一真值实际上是真的,而部分真值代表概率。例如,您是否会再次翻转尾巴(二元条件,50% 的概率)?答案是 0.5 * 0.5 = 0.25,或 25% 正确。累加实际上没有意义,因为它基本上是在模拟OR 条件(请记住,OR 可以在AND 条件不存在时由+ 建模,所以求和的特征是OR)。如果您正在查看一致性和测量值,则平均值是有意义的,但它实际上是在模拟ANDOR 的混合体。例如,请 2 个人从 1 到 10 分的范围内说出他们对“外面很冷”的说法的同意程度是多少?如果他们都说 5,那么“外面很冷”这句话的真实性是 50%。

总结中的非二进制值

从这种非二进制值的角度来看,我们可以在选择运算符时捕捉实际逻辑并从头开始构建方程,但我们必须牢记数值行为。我们习惯于将逻辑视为离散(二进制)并将计算机处理视为离散,但非二进制逻辑正变得越来越普遍,并且可以帮助使离散逻辑难以解决的问题更容易/可能解决。您需要考虑该地区的价值观如何相互作用,以及如何将它们转化为有意义的东西。


【讨论】:

你的回答对我很重要。 顶部的“XOR 任何数字输入”这句话有点误导,因为您不能使用此公式对两个任意 32 位值进行 XOR。将该等式应用于值 3 和 5 会产生 98 的结果,而不是按位异或对它们进行预期的 6。【参考方案2】:

“数学,仅算术表示”无论如何都不是正确的术语。您正在寻找的是一个从 IxI 到 I(整数域)的函数。 您希望对此功能有哪些限制?只有线性代数? (+ , - , * , /) 则无法模拟 XOR 运算符。 相反,如果您接受一些非线性运算符,例如 Max() Sgn() 等,则可以使用一些“更简单”的运算符来模拟 XOR 运算符。

【讨论】:

仅供参考,数学家通常使用 Z 表示整数。 I 有时是无理数,尽管这种情况很少见。 @user3042724,为什么不可能?【参考方案3】:

鉴于 (ab)(ab) 很明显计算单个位的异或,您可以使用 floor 或 mod 算术运算符构造一个函数来拆分位,然后对它们进行异或,然后总和重组。 (ab)(ab) = a2 -2·a·b + b2 所以一位 xor 给出了一个具有 3 项的多项式.

如果没有 floor 或 mod,不同的位会相互干扰,因此您只能寻找一个解决方案,即 polynomial interpolation 将输入 a、b 视为单个值:a xor b = g(a·232 + b)

多项式有 264-1 项,但在 a 和 b 中是对称的,因为 xor 是可交换的,因此您只需计算一半的系数。我没有空间给你写出来。

【讨论】:

【参考方案4】:

我找不到 32 位无符号整数的任何解决方案,但我找到了一些我试图在我的 Prolog 程序中使用的 2 位整数 解决方案。 我的一个解决方案(使用幂和模)在this *** question 中进行了描述,其他解决方案(一些没有幂,纯代数)可以在this code repository on Github 中找到:参见不同的xor0o_xor0 实现。

2 位 uint 的最佳异或表示似乎是:xor(A,B) = (A + B*((-1)^A)) mod 4

将 +、-、*、/ 表示为 Excel 公式的解决方案(其中从 A2 到 A5 的单元格和从 B1 到 E1 的单元格包含数字 0-4)要插入到从 A2 到 E5 的单元格中:

(1-$A2)*(2-$A2)*(3-$A2)*($A2+B$1)/6 - $A2*(1-$A2)*(3-$A2)*($A2+B$1)/2 + $A2*(1-$A2)*(2-$A2)*($A2-B$1)/6 + $A2*(2-$A2)*(3-$A2)*($A2-B$1)/2 - B$1*(1-B$1)*(3-B$1)*$A2*(3-$A2)*(6-4*$A2)/2 + B$1*(1-B$1)*(2-B$1)*$A2*($A2-3)*(6-4*$A2)/6

【讨论】:

【参考方案5】:

可以针对 32 位无符号整数调整和优化 this solution。它很复杂,它使用对数,但似乎是最通用的一种,因为它可以用于任何整数。另外,您必须检查它是否真的适用于所有数字组合。

【讨论】:

【参考方案6】:

我确实意识到这是一个老话题,但这个问题值得回答,是的,这可以通过算法实现。与其详细介绍它的工作原理,我将仅通过一个简单的示例(用 C 编写)进行演示:

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>   
    #include <time.h>

    typedef unsigned long
            number;

    number XOR(number a, number b)
    
            number
                    result = 0,
            /*
                    The following calculation just gives us the highest power of 
                    two (and thus the most significant bit) for this data type.
            */          
                    power = pow(2, (sizeof(number) * 8) - 1);
    /*
            Loop until no more bits are left to test...
    */                
            while(power != 0)
            
                    result *= 2;
            /*
                    The != comparison works just like the XOR operation.
            */                
                    if((power > a) != (power > b))
                            result += 1;
                    a %= power;
                    b %= power;
                    power /= 2;
            
            return result;
    

    int main()
    
            srand(time(0));
            for(;;)
            
                    number
                            a = rand(), 
                            b = rand();
                    printf("a = %lu\n", a);
                    printf("b = %lu\n", b);
                    printf("a ^ b     = %lu\n", a ^ b);
                    printf("XOR(a, b) = %lu\n", XOR(a, b));
                    getchar();
            
    

【讨论】:

【参考方案7】:

我认为这种关系可能有助于回答您的问题

A + B = (A  XOR  B ) + 2*(A.B) 

【讨论】:

【参考方案8】:

(a-b)*(a-b) 是正确答案。唯一的?我想是的!

【讨论】:

以上是关于XOR 的数学(算术)表示的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别