如何用Python实现布尔函数虚构变量(fictitious variable)识别算法
布尔函数虚构变量识别Python实现
虚构变量指的是不会影响布尔函数输出结果的变量,按照你给出的真值表对比规则,以下是可直接运行的实现:
纯Python实现(无第三方依赖)
完全匹配你给出的分段对比规则,同时保留了你原有代码的输入和真值表打印逻辑:
import itertools def get_fictitious_vars(func: str, var_count: int) -> list: # 前置校验:1的个数为奇数时不可能存在虚构变量 if sum(int(c) for c in func) % 2 != 0: return [] fict_vars = [] for i in range(var_count): # 每个对比分段的大小 chunk_size = 2 ** (var_count - i - 1) is_fict = True # 遍历所有需要对比的块 for block_idx in range(2 ** i): start = block_idx * 2 * chunk_size part0 = func[start : start + chunk_size] part1 = func[start + chunk_size : start + 2 * chunk_size] if part0 != part1: is_fict = False break if is_fict: fict_vars.append(f"x{i+1}") return fict_vars if __name__ == "__main__": print("输入变量个数:") args = int(input()) # 校验函数字符串长度 while True: print("输入布尔函数串:") func = input().strip() if 2 ** args == len(func): break print(f"长度错误,需要长度为{2**args}的字符串") # 打印真值表 print("\n真值表:") a = 0 for i in itertools.product('01', repeat=args): print(f"{' '.join(i)} | {func[a]}") print('-----------') a += 1 # 检测虚构变量 res = get_fictitious_vars(func, args) if not res: print("不存在虚构变量") else: print(f"虚构变量为:{', '.join(res)}")
更简洁的实现方案
使用numpy可以大幅简化逻辑,直接通过维度对比判断是否为虚构变量,代码更易维护:
import itertools import numpy as np def get_fictitious_vars_numpy(func: str, var_count: int) -> list: arr = np.array(list(func), dtype=int) # 把一维函数串重塑为和变量维度对应的多维数组 arr = arr.reshape([2]*var_count) fict_vars = [] for idx in range(var_count): # 直接对比当前变量取0和1时的所有输出是否一致 if np.array_equal(arr.take(0, axis=idx), arr.take(1, axis=idx)): fict_vars.append(f"x{idx+1}") return fict_vars # 输入和打印逻辑和上面完全一致,只需要把检测函数换成上面的即可
测试用例验证
- 变量数2,函数串
0110(异或函数):返回无虚构变量,符合预期 - 变量数3,函数串
00001111(仅和x1相关):返回虚构变量x2、x3,符合预期 - 变量数3,函数串
00110011(仅和x2相关):返回虚构变量x1、x3,符合预期
内容的提问来源于stack exchange,提问作者Назар Трухан
相关产品推荐
相关产品推荐

