通过真值表生成对布尔代数式的CNF语句约束

在密码学中,对S盒差分进行线性约束,使用工具LogicFriday

1.生成S盒输出输出差分真值表(.csv文件)
表头记录变量名称,输入输出变量以”,”隔开,如下图,输入变量为a~p,输出变量为y。
其中,输入变量代表S盒输入输出及概率的可能取值,输出变量值全部置1,代表此条变量取值可行。
在这里插入图片描述

2.导入真值表,约简布尔表达式
1)Logic Friday导入真值表

在这里插入图片描述

得到输出1(所有可行的条目)的布尔表达式约束

在这里插入图片描述

2)约简布尔表达式
在这里插入图片描述

并将其化为Product of sums形式
在这里插入图片描述

3.将多项式转变为约束
对Product of sums的每个乘法因子作为一个条目,转变形式,非记为”a_”,加法的每一项间用”,”隔开,例如,(a+o’)记为[“a”,”o_”]。将条目录入程序中并将变量名改为与布尔表示一致,输出CNF语句的系数约束。
用以下程序将变量表示的系数表转化为系数0,1,5(无)

arr = [["a","b","c","d","e_"],
["b_","e","f","g","h"],
]

var = ["a", "b", "c", "d", "e", "f", "g", "h"]

constraints = [[0 for j in range(len(var))] for i in range(len(arr))]

for i in range(len(arr)):
    for j in range(len(var)):
        if (var[j] + "_") in arr[i]:
            constraints[i][j] = 1
        elif ((var[j] + "_") not in arr[i]) and (var[j] in arr[i]):
            constraints[i][j] = 0
        else:
            constraints[i][j] = 5

for i in range(len(arr)):
    print(constraints[i], end="")
    print(",")
C语言是一种广泛应用于系统编程和嵌入开发的编程语言,它提供了丰富的语法和库函数来实现各种功能。在C语言中,输出真值表的主合取范和主析取范可以通过逻辑运算符和条件语句来实现。 主合取范(Conjunctive Normal Form,CNF)是一个逻辑表达的一种标准形,它由多个子句的合取构成,每个子句由多个文字的析取构成。在C语言中,可以使用逻辑运算符 &&(逻辑与)和 ||(逻辑或)来实现主合取范。 下面是一个示例代码,用于输出一个逻辑表达的主合取范: ```c #include <stdio.h> int main() { int a, b, c; printf("a\tb\tc\tResult\n"); for (a = 0; a <= 1; a++) { for (b = 0; b <= 1; b++) { for (c = 0; c <= 1; c++) { int result = (a && b) || (!b && c); printf("%d\t%d\t%d\t%d\n", a, b, c, result); } } } return 0; } ``` 上述代码中,使用三个嵌套的循环遍历所有可能的输入组合,并计算逻辑表达 `(a && b) || (!b && c)` 的结果。然后,将输入和结果输出到控制台。 主析取范(Disjunctive Normal Form,DNF)是一个逻辑表达的一种标准形,它由多个子句的析取构成,每个子句由多个文字的合取构成。在C语言中,可以使用逻辑运算符 &&(逻辑与)和 ||(逻辑或)来实现主析取范。 下面是一个示例代码,用于输出一个逻辑表达的主析取范: ```c #include <stdio.h> int main() { int a, b, c; printf("a\tb\tc\tResult\n"); for (a = 0; a <= 1; a++) { for (b = 0; b <= 1; b++) { for (c = 0; c <= 1; c++) { int result = (a || b) && (!b || c); printf("%d\t%d\t%d\t%d\n", a, b, c, result); } } } return 0; } ``` 上述代码中,同样使用三个嵌套的循环遍历所有可能的输入组合,并计算逻辑表达 `(a || b) && (!b || c)` 的结果。然后,将输入和结果输出到控制台。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值