Coin flipping and bit commitment

原文教材:

        Boneh Dan , Shoup Victor . A Graduate Course in Applied Cryptography[J].

        该书项目地址(可以免费获取):http://toc.cryptobook.us/

        系列博客为对该教材的学习笔记(只包括我认为重要的东西)


Coin flipping 

掷硬币协议

       掷硬币协议描述的是这样一种协议,如下图所示,当A与B企图对某一事件达成一种共识,例如A和B去电影院观看电影,但是A与B想要看不同的电影,直观上,A和B可以当场抛投一枚硬币来决定到底去看哪一部电影。但是,如果A和B并不在当面,而是作为通信的双方,如何实现抛硬币协议将采用更为复杂的方法。

                  

       一个简单的两方抛硬币协议如下:

       

         第一步:Bob 选择一个随机比特b0,生成承诺信息c = com(b0) 并发送给Alice. 生成解承诺信息s并保存在本地。

         第二步:Alice 随机选择一个比特b1, 此时要求承诺信息保证不能被学习到任何关于b0的信息,不然Alice会根据b0的信息适应性产生b1,达到利于自己的目的。

         第三步:Bob给Alice传送解承诺信息,然后根据协议生成最终结果,这里要求Bob不能根据获取的Alice输入,修改解承诺信息导致Alice解承诺的值与最初承诺值不同。

bit commitment

      为了实现上述的掷硬币协议,可以使用一种基本的密码学原语“比特承诺协议”。比特承诺协议描述如下图所示,参与方A选择一个自己要承诺的比特b,然后对b进行承诺得到承诺信息c,并将承诺信息c发送给参与方B。参与方A可以将解承诺信息s发送给参与方B。参与方B可以根据收到的解承诺信息对A的承诺比特进行验证。

      这要求该协议必须满足两个基本属性:

     (1)隐藏性(Hiding):承诺信息c 必须能完全隐藏b的信息,其他实体不能从承诺信息c中获取任何关于承诺比特b的信息。

     (2)捆绑性(Binding):参与方A的不能将承诺信息解为其他值。

      一个比特承诺协议的实例:

      

    Tips: 由于伪随机数生成器PRG是安全的,所以Alice无法通过G(s)学习到s。所以不论Bob承诺b0为多少,Alice 不能从c获取任何有益破解s的内容。又由于,PRG是安全的,所以Bob不能找出G(s`) = G(s) 或者 G(s`) = G(s) XOR r。

<think>好的,我需要回答用户关于COIN-OR Branch and Cut算法的问题,特别是实现方式、文档和示例。首先,我应该先了解用户提供的引用内容,看看是否有相关的信息可以利用。 引用[1]提到了Cbc,这是COIN-OR的分支切割法求解器,项目地址是给定的链接。这可能是一个主要的资源来源。用户可能希望了解如何使用Cbc库来实现分支切割算法。 引用[2]讨论了使用PuLP库中的线性表达式和约束,这可能与如何构建优化模型有关,虽然PuLP本身可能不直接实现分支切割,但用户可能在寻找如何结合使用这些工具的例子。 引用[3]给出了一个优化问题的输出示例,涉及变量数、约束数和目标值,这可能与如何解读Cbc的输出结果相关。 接下来,我需要整理COIN-OR Branch and Cut算法的基本信息。分支切割算法结合了分支定界法和切割平面法,用于解决整数规划问题。Cbc是COIN-OR项目中的一个求解器,实现了这一算法。 用户需要的是实现方式、文档和示例,因此我应该分点回答。首先介绍Cbc项目,然后说明如何获取文档,接着给出示例,可能包括代码示例和使用步骤。 关于实现方式,我需要说明Cbc可以通过源码编译或作为库调用,支持多种接口如C++、Python(通过PuLP或Pyomo)。在Python中使用PuLP调用Cbc是一个常见的示例,用户可能更容易理解。 文档方面,用户需要知道如何访问官方文档和示例代码,因此需要提供项目地址和文档链接。此外,Cbc的代码仓库可能包含示例文件,比如`examples`目录下的代码,这对用户有帮助。 示例部分,可以给出一个简单的整数规划问题,使用PuLP和Cbc求解的Python代码,这样用户可以直接运行并看到结果。同时,需要说明如何安装必要的库,如PuLP和Cbc的二进制文件。 可能需要注意用户提到的引用[2]中的内容,PuLP的约束构建方法,因此在示例中应该展示如何定义变量、目标函数和约束,这与引用中的内容相符。 需要确保所有数学表达式按照要求使用$...$格式,例如目标函数$maximize$或$minimize$,变量如$x$,约束如$3x + 4y \leq 10$等。 最后,生成相关问题需要考虑用户可能进一步想知道的内容,比如与其他求解器的对比、处理大规模问题的方法、调试技巧以及如何添加自定义切割平面等。</think>### COIN-OR Branch and Cut算法解析 COIN-OR Branch and Cut(简称Cbc)是开源的混合整数线性规划(MILP)求解器,结合了分支定界法(Branch and Bound)和切割平面法(Cutting Planes)[^1]。其核心思想是通过不断分割问题空间(分支)和添加有效不等式(切割)来逼近最优解。 #### 实现方式 1. **源码编译** Cbc代码库([项目地址](https://gitcode.com/gh_mirrors/cb/Cbc))提供C++实现,支持自定义算法扩展: ```bash git clone https://gitcode.com/gh_mirrors/cb/Cbc.git cd Cbc ./configure make ``` 2. **接口调用** 支持Python、Java等语言接口。例如通过PuLP库调用Cbc: ```python from pulp import LpProblem, LpVariable, LpMaximize prob = LpProblem("Example", LpMaximize) x = LpVariable("x", lowBound=0, cat="Integer") y = LpVariable("y", lowBound=0) prob += 3*x + 4*y, "Objective" prob += 2*x + y <= 10, "Constraint1" prob.solve() # 默认调用Cbc ``` #### 文档与示例 1. **官方文档** - [Cbc用户指南](https://coin-or.github.io/Cbc/intro.html) 包含算法原理与API说明 - 代码库中的`examples`目录提供经典问题实现(如`qap.cpp`) 2. **简单示例** 解整数规划问题: $$ \text{maximize } 3x + 4y $$ $$ \text{s.t. } 2x + y \leq 10 $$ $$ x \in \mathbb{Z}^+, y \geq 0 $$ 输出结果类似: ``` Optimal objective value = 23 x = 3 y = 2 ``` #### 关键参数配置 ```python prob.solve(pulp.PULP_CBC_CMD( maxSeconds=3600, fracGap=0.01, # 允许1%最优间隙 cuts=True # 启用切割生成 )) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值