本发明提出了一种用于解决加法链问题的简化幂树法,属于密码数学领域。
背景技术:
求解加法链问题,其定义如下:
给定一个正整数n,一个长度为r的可计算n的加法链(additionchain)u是一个严格递增的正整数序列u=(u0,u1,u2,…,ur),其中u0=1,u1=2,…,ur=n,且对任意的k>1,uk是它前面两个元素(不必不同)的和,即存在i,j<k使得uk=ui+uj,当i=j时,称该步为倍乘。当然,找到的可计算n的加法链长度越短越好,但对于给定的n,找一个具有最短加法链长度的加法链是很困难的问题。
二进制方法求解加法链问题,通过将一个正整数表示成二进制形式来分析,记num=1,把1加入链中,从最低位开始,num←num*2,把num加入到链中,如果对应位上为1,则num←num+1,把num加入链中,如此直至最高位,可以得到目标数的一条加法链。二进制方法比较简便,但求出的不是最短加法链,更常用于作为最短加法链的上界。
技术实现要素:
本发明提出了一种用于解决加法链问题的简化幂树法,用以得到一个正整数的加法链。
其具体流程如下,其中a←b,指把右侧b的值赋给a,以chain表示所得链:
step1预处理
选定一个正整数addnum,先用二进制方法求得其加法链,作为chain。
step2搜索主链
a.在预处理得到的chain中加入2k,λ(addnum)≤k≤λ(n);
b.记num=2λ(n),i=1;
c.取出chain中倒数第i个元素chain[-i],执行num←num+chain[-i],i←i+1,如果num<n,则在chain中加入num。重复执行此步,取出数为1则执行下一步;
d.如果num等于n,则表明已找到n的加法链,在chain中加入n,并记此时链长为l。
step3搜索支链
a.k=λ(addnum)开始,以主链上2k及之前的数作为chain;
b.加入2k+addnum到chain中;
c.记num=2k+addnum;
d.如果2*num超过n,则执行下一步,否则在chain中加入2*num,num←2*num。重复此步;
e.记num=chain[-1],i=1;
f.取出chain中倒数第i个元素chain[-i],执行num←num+chain[-i],i←i+1,如果num<n,则在chain中加入num,否则执行下一步。重复执行此步,取出数为1则执行下一步;
g.如果num等于n,则表明已找到n的加法链,在chain中加入num,比较此链长和l,如果此链长小于l,更新l←此链长。
h.如果k=λ(n)则执行下一步,否则k←k+1,转至a步;
i.最终返回l及对应链。
附图说明
图1是addnum=1实现实例的示意图。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面通过具体实施例,对本发明做进一步详细说明。
本实施例以addnnum=1,n=15为例,具体介绍本发明如何求解加法链问题。
step1预处理
选定一个正整数addnum=1,先用二进制方法求得其加法链,作为chain={1}。
step2搜索主链
a.在预处理得到的chain中加入2k,λ(addnum)≤k≤λ(n),chain={1,2,4,8};
b.记num=2λ(n)=8,i=1;
c.取出chain中倒数第i个元素chain[-i]=chain[-1]=8,执行num←num+chain[-i]=16,i←i+1=2,如果num<n,则在chain中加入num。重复执行此步:
取出chain中倒数第i个元素chain[-i]=chain[-2]=4,执行num←num+chain[-i]=12,i←i+1=3,如果num<n,则在chain中加入num。chain={1,2,4,8,12},重复执行此步:
取出chain中倒数第i个元素chain[-i]=chain[-3]=2,执行num←num+chain[-i]=14,i←i+1=4,如果num<n,则在chain中加入num。chain={1,2,4,8,12,14},重复执行此步:
取出chain中倒数第i个元素chain[-i]=chain[-4]=1,执行num←num+chain[-i]=15,i←i+1=5,如果num<n,则在chain中加入num。取出数为1,执行下一步;
d.如果num等于n,则表明已找到n的加法链,在chain中加入n,chain={1,2,4,8,12,14,15},并记此时链长为l=6。
step3搜索支链
a.k=λ(addnum)=1开始,以主链上2k及之前的数作为chain={1,2};
b.加入2k+addnum到chain中,chain={1,2,3};
c.记num=2k+addnum=3;
d.如果2*num超过n,则执行下一步,否则在chain中加入2*num,chain={1,2,3,6},num←2*num=6。重复此步:
如果2*num超过n,则执行下一步,否则在chain中加入2*num,chain={1,2,3,6,12},num←2*num=12。重复此步:
如果2*num超过n,则执行下一步;
e.记num=chain[-1]=12,i=1;
f.取出chain中倒数第i个元素chain[-i]=chain[-1]=12,执行num←num+chain[-i]=24,i←i+1=2,如果num<n,则在chain中加入num,否则执行下一步。重复执行此步:
取出chain中倒数第i个元素chain[-i]=chain[-2]=6,执行num←num+chain[-i]=18,i←i+1=3,如果num<n,则在chain中加入num,否则执行下一步。重复执行此步:
取出chain中倒数第i个元素chain[-i]=chain[-3]=3,执行num←num+chain[-i]=15,i←i+1=4,如果num<n,则在chain中加入num,否则执行下一步;
g.如果num等于n,则表明已找到n的加法链,在chain中加入num,chain={1,2,3,6,12,15},比较此链长5和l=6,如果此链长小于l,更新l←此链长5;
h.如果k=λ(n)则执行下一步,否则k←k+1=2,转至a步;
如此重复:
k=2,有chain={1,2,4,5,10,15},此链长为5,不更新;
k=3,有chain={1,2,4,8,9,13,15},此链长为6,不更新;
执行下一步;
i.最终返回l及对应链,l=5,chain={1,2,3,6,12,15}。
以上对本发明方法进行了详细的说明,但显然本发明的具体实现形式并不局限于此。对于本技术领域的一般技术人员来说,在不背离本发明所述方法的精神和权利要求范围的情况下对它进行的各种显而易见的改变都在本发明的保护范围之内。