我不确定这是我正在寻找的物业的正确名称,我希望有一些(甚至很多)研究已经完成,但无法找到任何东西。
我正在尝试测量"熵"或者"可逆性"一个表达式(用LLVM-IR编码,但除了这一点之外)。这有点模糊,但主要是关于我可以通过函数传递多少信息并进入外部。为了更加精确,如果我要将真正的随机值作为输入,那么我将得到一个真正的随机值作为输出。
上限是查看总输入位宽和总输出位宽,并采用最小位宽。更严格的上限是通过数据流图获取最小切割(总位宽)。但我想知道是否有一种通用的方法来更接近这个数字。也许是已知位分析的一般形式?
例如:
; entropy = 64bit (fully reversible)
define i64 @test_a(i32 %x, i32 %y) {
%x0 = zext i32 %x to i64
%y0 = zext i32 %y to i64
%z0 = shl i64 %x, 32
%z = or i64 %z0, %y0
ret i64 %z
}
; entropy < 64bit (it is not possible to distinguish permutation of the arguments,
; nor their respective prime decomposition)
define i64 @test_b(i32 %x, i32 %y) {
%x0 = sext i32 %x to i64
%y0 = sext i32 %y to i64
%z = mult i64 %x0, %y0
ret i64 %z
}
; entropy = 32bit (min-cut is on %z0 and is 32bit, the LSB of %z is %x xor %y)
define i64 @test_c(i32 %x, i32 %y) {
%z0 = xor i32 %x, i32 %y
%z1 = sext i32 %z0 to i64
%z2 = shl i64 %z1, 32
%z = xor i64 %z2, %z1
ret i64 %z
}
有没有办法得到那个熵的估计值?也许如果我将随机值抛入参数并对结果进行熵分析,它会给我一个好主意吗?
我对这个值感兴趣,因为它感觉与为该表达式生成电路的预期复杂性有关。例如,如果该表达式用于从地址计算中提取存储体,那么如果存储体计算是低熵,则交叉开关具有更大的稀疏机会。