精华内容
下载资源
问答
  • Boyer-Moore算法简介;与之前算法的比较; 朴素的思想-坏字符算法; 朴素的思想-坏字符算法; 朴素的思想-坏字符算法; 朴素的思想-坏字符算法; 朴素的思想-好后缀算法; 朴素的思想-好后缀算法; 朴素的思想-好后缀算法; ...
  • 数据结构与算法:为什么要学习数据结构与算法 数据结构与算法到底是什么 数据结构 ​ 数据结构指的是计算机中数据的组织形式,分为逻辑结构和物理结构两个维度。其中,逻辑结构是对数据组织形式在逻辑上的抽象,物理...

    数据结构与算法:为什么要学习数据结构与算法

    数据结构与算法到底是什么
    数据结构

    ​ 数据结构指的是计算机中数据的组织形式,分为逻辑结构和物理结构两个维度。其中,逻辑结构是对数据组织形式在逻辑上的抽象,物理结构则是基于存储设备对数据真实的组织管理,因此又被成为存储结构。学习和研究数据结构,就是研究数据的逻辑结构、物理结构及二者之间的关系。因此,数据结构中的”结构“二字,可以理解为数据之间存在的关系。

    算法

    ​ 算法在计算机领域指的是对特定问题的解决方案的一系列指令化描述。算法必须是明确且有穷的,即一个算法必须要有明确的定义,一定的输入在有限的步骤内可以获得要求的输出。

    数据结构与算法的关系

    ​ 算法是对一定的数据结构进行的特定操作,数据结构是算法的基础。在解决问题时,没有最好的算法,只有最合适的算法,数据结构也是。

    为什么要学习数据结构与算法

    ​ 知道了什么是数据结构与算法,接下来聊聊为什么要学习它。

    ​ 首先,最现实的问题是无论校招还是社招,技术面试中多多少少都会问到数据结构与算法相关的问题。例如最直接的一种,面试官上来就让手写一个快排的代码,或者给一段代码,要求分析时间复杂度和空间复杂度。

    ​ 其次,日常繁杂的业务工作往往容易让人忽略程序实现细节和原理。就 Java 来说,无论是其自身的基础 API,还是第三方提供的开源框架,都糅合很多优秀的数据结构和算法的设计思想。

    ​ 最后,如果不重视程序的性能好坏,日复一日业务开发显然无法持续提升个人的编程和设计能力。而提升代码质量的第一步,就是建立起时间复杂度、空间复杂度的意识。

    ​ 综上,扎实的数据结构与算法基础,能大大提升面试通过率,大大提升对语言、框架和工具的理解层次,大大提升编程和设计能力。

    展开全文
  • 粒子群算法及其改进算法

    万次阅读 多人点赞 2019-07-01 19:27:08
    标准粒子群算法及其改进算法 首先在这里介绍一下,这个里主要介绍粒子群算法以及一个改进的二阶振荡粒子群算法。 原理 粒子群优化(PSO)算法是Kennedy和Eberhart受 鸟群群体运动的启发于1995年提出的一种新的群...

    标准粒子群算法及其改进算法

    首先在这里介绍一下,这个里主要介绍粒子群算法以及一个改进的二阶振荡粒子群算法。

    原理

    粒子群优化(PSO)算法是Kennedy和Eberhart受 鸟群群体运动的启发于1995年提出的一种新的群智能优化算法[1]。大概的意思就是一片森林里有一群鸟在找一块食物,它们不知道食物具体在哪,但是可以通过感官(例如嗅觉)去察觉到自己当前位置距离食物的远近。鸟可以记住自己走过的位置并且知道自己做过的最优位置。这一群鸟的运动都是随机的,这类似于一种穷举法。

    标准粒子群算法

    粒子群算法一般用来找一个函数的最优值。这个函数一般就是适应度函数。
    函数中未知量的个数就是这个查找的空间维度。

    假设有N个粒子组成一个种群S

    Xi是代表粒子i所在的位置,i=1,2,…,N

    Vi代表粒子i在位置Xi处的速度,i=1,2,…,N

    pi是记录粒子i到走过的最优位置,i=1,2,…,N

    pg是所有粒子走过的最优的位置,i=1,2,…,N

    w 为惯性权重

    c1 、 c2 为学习因子

    r1,r2为[ 0 , 1 ]之间均匀分布的参数

    接下来种群中每个粒子按照公式更新速度和位置:

    Vi( t +1 ) =w * Vi( t ) + c1 * r1 * (pi - xi( t ) ) + c2 * r2 * ( pg - xi( t ) ) (1)
    xi( t + 1 ) = xi( t ) + vi( t + 1 ) (2)

    PS:这里的r1、r2是每一步迭代都需要更新的随机数
    c1、c2和w =则是一开始给定的一些参数,至于参数的给定取决于你自己每次测试这个程序所得到的经验–即哪些参数你跑出的结果比较好就选择哪些参数。
    在这里再插一句,在我的实践中认为没有必要去限制迭代过程中速度和位置是否超过最大值,如果在给定区间内存在最优值那么最后还是会迭代回来。只需要在给定的区间内初始化就OK了。在我最开始的测试过程中限制速度和位置是使程序变慢了的,但是我一开始的思路出了问题,到很后面才改正过来也么有再去测试这个,所以就不加评论了。

    算法流程

    在这里插入图片描述

    标准PSO算法代码

    function [xm,fv]=Pso(N,c1,c2,w,M,D)
    %c1:自我学习因子
    %c2:社会学习因子

    %w:惯性权重
    %N:种群数量`
    %M:最大迭代次数
    %D:维数

    %初始化种群、速度和位置
    tic
    for i=1:N
    for j=1:D
    x(i,j)=unifrnd(-10,10);
    v(i,j)=unifrnd(-10,10);
    end
    end

    %根据适应度计算适应度值,初始化pi和pg
    for i=1:N
    y(i)=test(x(i,:));
    pi(i,:)=x(i,:); %y(i,:)为最优位置
    end
    k = find( y == min(y) ) ;
    pg=x(k(1), : ) ;
    %更新位置与速度
    for t=1:M
    for i=1:N
    v(i,:)=wv(i,:)+c1rand*(pi(i,:)-x(i,:))+c2rand(pg-x(i,:));
    x(i,:)=x(i,:)+v(i,:);
    if test(x(i,:))<y(i)
    y(i)=test(x(i,:));
    pi(i,:)=x(i,:);
    end
    if y(i)<test(pg)
    pg=pi(i,:);
    end
    end
    pbest(t)=test(pg);
    end

    %输出结果
    disp(‘最优位置’);
    xm=pg
    disp(‘最优值’);
    fv=test(pg)
    plot(pbest)
    toc

    test函数–就是适应度函数

    function y = test( V )
    y=0;
    b=length(V);
    for i=1:b
    y=y+i*V(i)^2;
    end

    标准粒子群算法的局限性

    为进一步说明标准粒子群算法的局限性,做如下推理:
    设 φ1=c1*r1 ,φ2=c2r2 ,w=1,由式(1)、(2)可转化 为式(3)、(4):
    Vi( t+1) =Vi( t) +φ1(pi -xi(t))+φ2(pg -xi(t)) (3)
    xi(t+1)=xi(t)+vi(t+1) (4)
    已知速度公式Vi+1=Vi +a×Δt ,可得: a=φ1(pi -xi(t))+φ2(pg -xi(t))=xi(t)″ (5)
    化简可得: xi(t)″+(φ1+φ2)xi(t)-(φ1pi +φ2pg)=0 (6)
    式(6)是二阶微分方程,通过二阶微分方程求解公式,求得搜索位置在 t 代的 x(t)的位置路径公式: xi(t)=C1 cos( φ1+φ2t)+C2 sin( φ1+φ2t) (7)
    由式(7)可知,xi(t) 在一个固定区间内波动,即在 该区间中寻找每个粒子第 t 次迭代后的位置,位置函数 xi(t) 没有振荡收敛,算法容易陷入局部最优。
    例如,令 C1=1,C2=1, φ1+φ2 =1 ,可得位置函数 xi(t)=cos(t)+ sin(t)的图像,如图1所示。在该图像中, 对于t∈[ -∞,+∞] , xi(t) 始终在固定上下限 [- 2, 2] 内范围波动,没有振 荡收敛,容易陷入局部最优。因此,在算法中加入振荡 收敛,是跳出局部最优解,提高粒子群算法搜索性能和精度较有效的方法。[1]

    在这里插入图片描述

    改进标准粒子群算法的思想

    胡建秀,曾建潮通过在标准二阶粒子群算法速度迭 代方程中引入二阶振荡环节的方法改进算法,来增加粒 子的多样性,提高算法的全局搜索能力,是改进位置函 数搜索区域较好的改进方法。使用二阶振荡环节后,算法前期具有较强的全局搜索能力,振荡收敛;而在后期强局部搜索,渐近收敛。 该粒子群算法的进化方程如下:
    Vi( t+1) =w×Vi( t ) + φ1(pi -(1+ξ1)xi(t)+ξ1xi(t-1))+ φ2(pg -(1+ξ2)xi(t)+ξ2xi(t-1)) (8) xi(t+1)=xi(t)+vi(t+1) (9) 算法振荡收敛:
    ξ1<2 φ1 -1 φ1 ,
    ξ2<2 φ2 -1 φ2 (10)
    算法渐进收敛:
    ξ1 ≥2 φ1 -1 φ1 ,
    ξ2 ≥2 φ2 -1 φ2 (11) 振荡收敛和渐进收敛示意图如图2和图3所示。[ 1 ]
    在这里插入图片描述

    改进后二阶振荡粒子群算法的迭代公式

    Vi( t+1 ) =w×Vi( t ) + φ1(pi -(1+ξ1)xi(t)+ξ2xi(t-1))+ φ2(pg -(1+ξ3)xi(t)+ξ4xi(t-1)) (12) xi(t+1)=xi(t)+vi(t+1)

    这个公式的实在上面的二阶振荡粒子群算法的基础上进行的改进,这里ξ虽然是随机数但是取值是有限制的:
    设最大迭代次数为Gmax ,
    0<ξ2<1+ξ1 2 ,0<ξ4 <1+ξ3 2 ,0<ξ1<1,0<ξ3<1 当 t < Gmax / 2时,
    ξ1<ξ2-1,ξ3<ξ4 -1,0<ξ2<1,0<ξ4 <1 当 t > Gmax / 2 时
    这么做的意义在于可以时算法在迭代的前半段振荡收敛;
    在迭代的后半段使其渐进收敛。
    这里的证明和上面的二阶振荡粒子群算法的类似,我这就不展开了,感兴趣的可以自己去找我参考的文献。
    PS:关于改进算法的流程图和标准算法的类似,无非就是加了一个迭代次数前一半和后一半参数的改变,这里就不加上去了。

    改进二阶振荡粒子群算法代码

    function [ z , best ] = PSO_1( w , Gmax ,lizishu , weidu ,a , b )
    %这个测试函数的最小值是0,取值范围是[-10 , 10]
    % z是最优点的适应值,best是记录最优位置的坐标

    %lizishu输入需要的粒子数
    %weidu函数的自变量个数
    %a下界
    %b上界
    q=zeros(1,Gmax);
    tic
    p = inf * ones( 1 , lizishu ) ;%初始的最优解默认为inf
    % pg = 0 ;
    A = unifrnd( a , b , lizishu , weidu ) ;%A矩阵是位置矩阵,用于储存每一步计算出的位置
    B = unifrnd( a , b , lizishu , weidu ) ;%B是速度矩阵,用于储存每一布计算出的V
    C = A ;%用于记录每个粒子的最优位置
    D = unifrnd( a , b , lizishu , weidu ) ;%位置矩阵,用于记录上一次迭代的位置
    c = 2 ; %c通常取1.5 , 这是一个经验值
    y = [] ;%给y申请空间
    for i = 1 : lizishu
    y = [ y , test( A( i ,: ) ) ] ;
    end

    for i = 1 : lizishu
    if p( i ) > y( i )
    C( i , : ) = A( i , : ) ;
    end
    p( i ) = min( [ p( i ) , y( i ) ] ) ;%更新局部最优解
    end

    %初始化全局最优解
    k = find( p == min( p ) ) ;
    pg = C( k( 1 ) , : ) ;
    q( i ) = test( pg ) ;

    for i = 1 : Gmax
    i
    r1 = unifrnd( 0 , 1 ) ;
    r2 = unifrnd( 0 , 1 ) ;
    u1 = r1 * c ;
    u2 = r2 * c ;
    if i < Gmax / 2
    g1 = unifrnd( 0 , 1 ) ; % 这里g1是[ 0 , 1 ]上均匀分布的随机数
    g2 = ( 1 + g1 ) / 2 ;
    g3 = unifrnd( 0 , 1 ) ;
    g4 = ( 1 + g3 ) / 2 ;
    for j = 1 : lizishu
    B( j , : ) = w * B( j , : ) + u1 * ( C( j , : ) - ( 1 + g1 ) * A( j , : ) + g2 * D( j , : ) ) + u2 * ( pg - ( 1 + g3 ) * A( j , : ) + g4 * D( j , : ) ) ;
    D = A ;
    A( j , : ) = A( j , : ) + B( j , : ) ;
    end
    else
    g2 = unifrnd( 0 , 1 ) ; % 这里g2是[ 0 , 1 ]上均匀分布的随机数
    g1 = ( g2 - 1 ) / 4 ;
    g4 = unifrnd( 0 , 1 ) ;
    g3 = ( g4 - 1 ) / 4 ;
    for j = 1 : lizishu
    B( j , : ) = w * B( j , : ) + u1 * ( C( j , : ) - ( 1 + g1 ) * A( j , : ) + g2 * D( j , : ) ) + u2 * ( pg - ( 1 + g3 ) * A( j , : ) + g4 * D( j , : ) ) ;
    D = A ;
    A( j , : ) = A( j , : ) + B( j , : ) ;
    end
    end
    y = [] ;%下一次迭代前清空y
    for j = 1 : lizishu
    y = [ y , test( A( j ,: ) ) ] ;
    end

       for j = 1 : lizishu
          if p( j ) > y( j )
            C( j , : ) = A( j , : ) ;
          end
            p( j ) = min( [ p( j ) , y( j ) ] ) ;
       end
    
        k = find( p == min( p ) ) ;%找到最优解的位置
        pg = C( k( 1 ) , : ) ; %保存最优解坐标
        q(i) = test( pg ) ;
    

    end
    z = q( Gmax ) ;
    best = pg ;
    toc
    plot(q)

    test函数

    function y = test( V )
    y=0;
    b=length(V);
    for i=1:b
    y=y+i*V(i)^2;
    end

    两个算法的比较

    PS:上面我只给了一个test函数,要测试其他的函数直接更改test函数即可。
    下面是两个维度跑出来的结果
    1、标准PSO算法:
    在这里插入图片描述
    在这里插入图片描述
    2、改进的二阶振荡PSO算法:
    在这里插入图片描述

    在这里插入图片描述
    在低维度上这两个算法没有太大差别,改进的算法速度上要稍微快一点。

    下面把维度提升到100维:
    PS:为了便于观看我改了一下程序,最后都只输出一个最优值。
    1、这是标准PSO算法跑出的结果:在这里插入图片描述
    很明显这并没有达到最优值,只是一个局部最优。

    2、改进的PSO算法:
    在这里插入图片描述
    可以看到改进的算法的结果在100维下依旧不错,而且很快。

    下面我们尝试1000维:
    改进的PSO算法结果如下:在这里插入图片描述

    我也试过一些最小值是无穷的函数(X^3),以及一些振荡函数(sinx+cosx),都可以跑出结果,这里就不一个个的给出结果了。

    PS:因为第一个算法不是我写的原因,是我同学写的我拿来用的,所以两个代码在风格上差别有点大。
    这个博客的证明部分基本上我都是从下面的文献里直接拿过来的。
    最后如果找出我的错误请告诉我,我会及时改正的。

    参考文献

    [ 1 ] 蒋丽,叶润周,梁昌勇等,改进的二阶振荡粒子群算法[J],计算机工程与应用,2009,55(9):130-139

    展开全文
  • 算法与数据结构》学习指导...为了让使用《算法与数据结构》作为教材的教师和学生在广度和深度的各个层面更深刻地理解理论、抽象和设计这三个过程以及重复出现的十二个基本概念,掌握算法设计与分析的基本技能...
  • 机器学习算法 无监督学习 算法

    千次阅读 2019-06-26 14:51:22
    本文介绍无监督学习算法: 聚类算法 Apriori算法 FP-growth 算法 1 聚类算法 2 Apriori算法 3 FP-growth 算法

     本文介绍无监督学习算法:

    - 聚类算法

    - Apriori算法

    - FP-growth 算法

     因时间关系,就简单介绍其原理,不涉及实例和代码

    1 聚类算法

     聚类(Clustering)与分类(classification)的最大不同在于,分类的目标事先已知,而聚类不一样,因产生结果和分类相同,

    只是类别没有预先定义,所以聚类也有时叫无监督分类(Unsupervised classification)

     所谓无监督学习是指事先并不知道要寻找的内容,即没有目标变量。聚类将数据点归到多个簇中,其中相似数据点处于同一簇,

    而不相似数据点处于不同簇中。聚类中可以使用多种不同的方法来计算相似度。

    1.1 K-均值聚类算法

     一种广泛使用的聚类算法是K-均值算法,其中K是用户指定的要创建的簇的数目。K-均值聚类算法以K个随机质心开始。算法会计算

    每个点到质心的距离。每个点会被分配到距其最近的簇质心,然后紧接着基于新分配到簇的点更新簇质心。以上过程重复数次,直到簇质

    心不再改变。

     优点:容易实现

     缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢。

     适用数据类型:数据型数据

     实现思路:

      随机设定K个簇质心点,然后最近原则进行分类(簇),重新计算质心(族所有点的均值作为簇心),重复过程直到没有变化为止


    比如,如下图,先随机选择两个质心点(红色圈圈)
    在这里插入图片描述
    然后把所有点遍历一遍,并把它分给最近的那个质心的簇。第一次计算结果如下
    在这里插入图片描述
    重新计算,簇质心点,大致如下
    在这里插入图片描述
    第二轮分配簇结果
    在这里插入图片描述
    继续重新计算质心,分簇,直到无变化为止

    1.2 二分K-均值算法

     克服k-均值算法收敛于局部最小值的问题

     实现思路:

      先把所有点分成一个簇

      每次当前的簇,寻找二分后误差最低的簇,对其进行二分

      重复第二步,直到达到簇的个数达到K

    2 Apriori算法

     关联分析是一种在大规模数据集中寻找有趣的任务。这些关系有有两种形式:频繁项集或关联规则。

    频繁项集(frequent imtem sets)是经常出现在一起的物品的集合,关联规则(association rules)暗示两种物品之间可能存在

    很强的关系。

     先得到频繁项集,基础上计算关联规则

    2.1 频繁项集原理

      - 计算单个元素集(C1)的支持度,去掉低于最小支持度的元素,得到L1

      - 构建2(K+1)个元素组成的候选项列表C2(Ck+1),由L1(Lk)原则组合去掉重复的,计算C2(Ck+1)的支持度并去掉

    不符合条件的,得到L2(Lk+1)

      - 循环到Lk+1空为止

    2.2 关联规则原理

     直接看实现比较好理解,这里忽略


    3 FP-growth 算法


     比较高效的发现频繁项集的方法,比较高效的发现频繁项集的方法:先构建FP树,再从FP数据挖掘频繁项集

    3.1 先构建FP树

     原理:遍历两次,

     第一次遍历计算每个元素的出现频率并去掉不符要求的。生成一个元素header列表。

     第二次遍历,对首先对每一个项集去掉非频繁元素,按出现频率进行排序。按排好的新项集的原色从频率高到底,逐步添加到FP-

    tree中,方法就是当前元素节点的child技术加1,否则新创建child节点。此外header 列表对每个元素形成一个列表(第一个出现时

    header列表执行该元素,之后插入到链表未中)

    3.2 从FP数据挖掘频繁项集

     - 抽取条件模式基(前缀路径)

     - 创建条件FP树

     实现原理:

      findPrefixPath获取一个元素的所有前缀路径(条件模式基)
    在这里插入图片描述
     mineTree 创建条件FP树,从头指针列表低端开始,每一个元素进行获取前缀路基,使用前缀路基构建新tree。对新建tree每个元素

    再进行mineTree(一直递归到新建tree为止)。 频繁项集取prefix+当前的元素。prefix从空开始,逐步增加,如上图t,其prefix依次

    [null]、 [t]、[t、y]、[t、x]、等等,

    展开全文
  • 像小说一样轻松学习算法,很容易理解算法知识点。而且里面还有标签。
  • 常见密码学算法

    千次阅读 2020-06-22 16:15:21
    常见密码学算法:DES,AES; RSA, ECC; Hash; Signature等。 分类 对称密码 流密码 分组密码 非对称密码 不同阶段 古典/经典密码(凯撒密码),(1949 Shannon)近代密码(DES/AES),(1976 Diffie-Hellman, ...

    学习笔记

    分类


    密码学用于解决信息安全中的保密性,完整性,认证和不可否认性等问题。最初主要用于解决保密性。随着密码学技术的发展,逐渐应用到其它领域。
    常见密码学算法:DES,AES; RSA, ECC; Hash; Signature等。

    分类

    • 对称密码
      • 流密码
      • 分组密码
    • 非对称密码

    不同阶段
    古典/经典密码(凯撒密码),(1949 Shannon)近代密码(DES/AES),(1976 Diffie-Hellman, 1977 RSA)现代密码(RSA),(展望:量子密码等)

    参考:
    Ref https://mp.weixin.qq.com/s/wiblmEu14iB1yx6g6sTCnw
    Ref Wikipedia
    Ref 密码学发展史(https://github.com/guoshijiang/Cryptography_anyone_can_understand/blob/master/history/README.md)

    各类算法


    经典密码

    凯撒密码

    对称密码

    加密和解密使用相同的秘钥。优点是加密解密效率高,缺点是秘钥的分发需要在隐秘通道进行。安全性取决于根据密文无法推出明文和秘钥。

    • 基于异或的一次性密码。(多个密文可以解密出秘钥)(一次一密密码被证明是绝对安全的密码。1949 Shannon)

      • 秘钥大于等于原消息,具备很好的安全性
      • 问题是秘钥长度很大不易分配和管理
    • 流密码。使用伪随机生成器,根据初始秘钥来生成一次性秘钥。安全性取决于与初始秘钥的保密性和伪随机生成器的随机性(不可预测性)。保密性较一次性密码弱,但秘钥容易分配和管理。
      使用流密码要考虑安全性,例如同一个key不能使用两次:

    Stream ciphers, where plaintext bits are combined with a cipher bit stream by an exclusive-or operation (xor), can be very secure if used properly[citation needed]. However, they are vulnerable to attacks if certain precautions are not followed:
    keys must never be used twice
    valid decryption should never be relied on to indicate authenticity
    From https://en.wikipedia.org/wiki/Stream_cipher_attacks

    • 分组密码:加密的明文和输出的密文长度相同,秘钥决定了输入明文和输出密文的映射关系,且是1对1映射。为了加密任意长度的明文,引入了电子密码本模式(Electronic codebook, ECB)和分组链接模式(Cipher block chaining, CBC)等。例如DES,AES

    非对称密码

    加密和解密使用不同的秘钥。优点是秘钥分发和管理更方便,且可以支持签名等功能。缺点是加密和解密效率低。安全性取决于根据密文和公钥无法推出明文和私钥。

    RSA系列

    • RSA
    • Diffe-Hellman Key exchange
    • DSA

    ECC系列

    • ECIES
    • ECDH
    • ECDSA

    各种算法


    RSA

    RSA 原理、构建、加解密和大数分解的安全假设
    Ref http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html
    Ref http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html
    Ref wikipedia https://en.wikipedia.org/wiki/RSA_Security https://en.wikipedia.org/wiki/RSA

    数学基础

    欧拉函数

    欧拉定理
    在这里插入图片描述
    模逆元
    在这里插入图片描述
    如果ab对n模1

    • 则有ab = h*n + 1
    • 进一步有 m^ab = m^(hn+1) = m^(hn) * m

    RSA构建

    • 取两 个质数p,q,求得n=p*q, 欧拉函数phi(n)=phi§phi(q)=(p-1)(q-1)
      • 取两个质数方便求解欧拉函数phi(n)
    • 取一个与n互质的数e,求解d使得e*d模phi(n)为1
      • ed模phi(n)为1,则有 m^(ed) = m^(hphi(n) + 1) = m^(h*phi(n)) * m 模n的值为m
    • (n,e)为公钥,(n,d)为私钥,其它数据如phi(n), q, p不公开
      • RSA的安全性保障在于大整数因式分解是个难题,已知(n,e)很难求解d使得 e*d模phi(n)的值为1
        • 求解d需要phi(n)
        • 而求解phi(n)需要p,q
        • 而从n求解p,q是个大整数因式分解问题

    RSA加解密

    • 密文为m^d mod n
    • 明文为m^(d*e) mod n = m^(phi(n)+1) mod n = m ^ phi(n) * m mod n
      • 如果m和n互质,则明显明文解密后为m
      • 如果m和不互质,也可证明明文解密后为m
        RSA上的算法有加解密,签名,秘钥交换等
        RSA的秘钥长度应该在1024以上,重要场景需要2048

    RSA乘法同态

    • A =Enc(a, pk_dn) = a ^d mod n
    • B = Enc(b, pk_dn) = b ^d mod n
    • A*B = Enc(ab, pk_dn) = (ab)^d mod n = a ^d * b ^d mod n

    Diffie-Hellman key exchange

    Diffie-Hellman密钥交换算法
    基于离散对数难问题
    p为素数,假定g是生成器,基于x (1,2,…,p-1),有n使得x=g^n mod p

    • p和g公开
    • A: g^a mod p
    • B: g^b mod p
    • 则A*B = (ga)b mod p = (gb)a mod p
    • A + B = g^a + g^b mod p = g^(a+b) mod p

    加法同态

    • A = g^a
    • B = g^b
    • A + B = g^a * g^b = g ^ (a + b)

    ECC椭圆曲线密码学

    定义在椭圆曲线上的加法群,其中无穷远点是单位元O。

    • 然后可定义逆元,加法运算,结合律,交换律。
    • 几何定义可参见上面的链接。加法的代数计算见上面链接。
    • 如何在有限椭圆曲线上构造参数见上面链接

    应用:
    ECDH, ECDSA

    Ref:
    https://andrea.corbellini.name/2015/05/17/elliptic-curve-cryptography-a-gentle-introduction/
    https://www.jianshu.com/p/3b810faff3ba

    ElGamal 加密算法

    基于Diffie-Hellman算法,基于离散对数难问题
    https://zh.wikipedia.org/wiki/ElGamal%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95

    • Diffie-hellman版本
    • ECC版本

    算法

    • Alice的公钥和私钥(a,g^a)
    • Bob的公钥和私钥(b,g^b)
    • Bob对数据m的加密数据为: 将m映射到曲线上一点,如(m,m_y),则加密为(g^b, m_y*((g^a)^b))

    Difference of pedersen and elgamal

    https://crypto.stackexchange.com/questions/11923/difference-between-pedersen-commitment-and-commitment-based-on-elgamal

    • Pedersen: gm*hr. No one know the y such that h=g^y.
    • Elgamal: g^r, gm*hr. receiver knows the y such that h=g^y.
    • If receiver knows the y such as h=g^y, then receiver can get g^m.
      ○ The main difference is that Pedersen commitments are unconditionally hiding. It will becomes to be computing hiding if
    • If sender knows the y such as h=g^y, then there is a trapdoor commitment in elgamal.

    各种安全假设


    http://blog.sciencenet.cn/blog-1362128-1095141.html
    - 整数分解假设
    - RSA假设
    - 离散对数假设

    数学基础


    集合论基础

    • 非空集合,满足封闭性,是广群;再满足结合律,是群;有单位元,是幺半群;有逆元是群;再满足交换律,是阿贝尔群。
    • 群。<R,+>表示一个拥有满足封闭性、满足结合律、有单位元、有逆元的二元运算的代数结构,包括阿贝尔群、同态和共轭类。
      • 满足交换律,则是阿贝尔群
    • 环。<R,+,*)表示一个环。单位元不同。
      • 在+上是一个阿贝尔群
      • 在*上满足结合律,是一个半群
      • 对+和*满足分配律
    • 域。设<R,+,* >是环,如果<R,+>和<R-{0},>都是交换群(“0”为<R,+>的单位元)且满足分配律,则称<R,+,>是域。比如:有限整数环<R,+,*>是域。

    循环群是—种很重要的群,也是已被完全解决了的—类群。其定义为若—个群G的每—个元都是G的某—个固定元a的乘方,则称G为循环群,记作G=(a),a称为G的—个生成元。循环群有无阶循环群和有阶循环群两种类型。
    From https://baike.baidu.com/item/循环群

    Next


    • Comparation of ECDH and DH
    • Comparation of ECDSA and DSA
    • 其它体系https://blog.csdn.net/jingzi123456789/article/details/104761739/
      • ElGamal
        • 加密数据具备乘法同态
      • Paillier
        • 加密数据具备加法同态
    展开全文
  • BAT算法工程师的成长之路,超详细的学习路线

    万次阅读 多人点赞 2020-10-09 13:34:27
    算法的学习路线,主要分为 4 个部分:数学基础、编程能力、算法基础、实战。
  • 算法越扎心,有没啥破解之法?

    万次阅读 多人点赞 2020-03-10 00:36:58
    对于算法的学习,我也是从一个小白一步步走来,当然,现在仍然很菜,,,不过,鉴于我觉得还有一些人比我更菜了,我决定谈谈我算法学习过程走过的坑,以及自己总结的一些经验。 切勿盲目刷题:刷题前的知识积累 说...
  • 详解遗传算法(含MATLAB代码)

    万次阅读 多人点赞 2019-05-29 11:30:47
    一、遗传算法概述 二、遗传算法的特点和应用 三、遗传算法的基本流程及实现技术 3.1 遗传算法的基本流程 3.2 遗传算法的实现技术 1.编码 2.适应度函数 3.选择算子 4.交叉算子 5.变异算子 6.运行参数 四、...
  • 梯度下降算法

    千次阅读 2019-11-29 14:14:14
    4.梯度下降 4.1什么是梯度下降? 梯度下降法的基本思想可以类比为一个下山的过程 ...这个时候,他就可以利用梯度下降算法来帮助自己下山。 具体来说就是,以他当前的所处的位置为基准,寻找这个位置最陡峭...
  • matlab 一维信号的形态分析核心算法实现(for matlab)。 在matlab环境编程实现了形态的核心算法:膨胀、腐蚀,进一步可用它们的组合实现形态的开运算,闭运算,交替滤波、混合滤波、交替混合滤波、梯度、多...
  • 我学习算法的心得

    千次阅读 多人点赞 2018-11-02 21:24:36
    今天我想给大家分享一下我学习算法的一些心得,起因是有学弟问我两道题,在给他讲题的时候给他讲了一些我学习或者说研究算法的心得,我觉得可能会对大家有帮助所以想分享给大家。 先上题说话吧: 第一题:a和n均为...
  • 分水岭算法及案例

    万次阅读 多人点赞 2017-11-29 13:04:32
    分水岭算法Watershed Algorithm(分水岭算法),顾名思义,就是根据分水岭的构成来考虑图像的分割。现实中我们可以或者说可以想象有山有湖的景象,那么那一定是水绕 山,山围水的情形。当然在需要的时候,要人工构筑...
  • 我个人觉得算法里面极大一部分内容是如何有效地进行搜索,这里的”有效”可以分为:避免不必要的计算(如A*寻路以及所有的启发式剪枝),缓存重复计算(如所有­的动态规划)。当然,知道这些跟具体的设计出一个算法...
  • 程序员须知面试中最容易被问到的18个算法算法是比较复杂又基础的学科每个编程的人都会学习大量的算法而根据统计以下这18个问题是面试中最容易遇到的本文给出了一些基本答案供算法方向工程师或对此感兴趣的...
  • 左程云:程序员该如何学习算法

    千次阅读 多人点赞 2018-01-09 16:13:28
    大家好,我是左程云。我本科就读于华中科技大学、硕士毕业于在芝加哥大学。先后在IBM、百度、GrowingIO和亚马逊工作,是一个刷题7年的算法爱好...这篇我想写写算法的重要性、我个人是如何学习算法以及一些如何学习算法
  • 粒子群算法详解

    万次阅读 多人点赞 2016-12-02 16:44:35
    ❃粒子群算法(particleswarm optimization,PSO)由Kennedy和Eberhart在1995年提出,该算法对于Hepper的模拟鸟群(鱼群)的模型进行修正,以使粒子能够飞向解空间,并在最好解处降落,从而得到了粒子群优化算法。...
  • 算法设计与分析学习总结

    千次阅读 多人点赞 2019-12-11 01:27:04
    算法设计与分析学习总结 通过对《算法设计与分析》这门课的学习,似乎对算法有了一定的了解,之前对算法并没有太多的接触,只是一些普通的编程。选课的时候,觉得特别有意思,就选了这门课,通过学习各类算法,有了...
  • 一文搞懂K-means聚类算法

    千次阅读 2019-12-01 16:09:30
    一步步教你轻松K-means聚类算法 阅读目录目录聚类K-means(k均值)聚类算法案例描述从文件加载数据集计算两个向量的欧氏距离构建一个包含 K 个随机质心的集合K-Means 聚类算法分析数据:聚类可视化结果讨论与分析...
  • 数学建模算法学习——各类模型算法汇总

    千次阅读 多人点赞 2019-09-08 14:28:50
    数据分析类算法一览 100个经典动态规划方程 优化问题 线性规划 简介:线性规划的目标函数可以是求最大值,也可以是求最小值,约束条件的不等号可以是小于号也可以是大于号。为了避免这种形式多样性带来的不便,...
  • HITS算法是另外一个链接算法,部分原理与PageRank算法是比较相似的,HITS算法引入了权威值和中心值的概念,HITS算法是受用户查询条件影响的,他一般用于小规模的数据链接分析,也更容易遭受到攻击。详细介绍链接 K-...
  • 如何学习算法的相关文章,大家估计也见过不少,每个人的学习方法都不尽相同,这很正常,并且,对于不同的选手,例如打 ACM 的玩家和不打比赛的玩家来说,训练的方式也会有所差异,所以别人所说的学习方式,更多的是...
  • 大一从一个小白一路走过来,也在 leetcode 刷...但是,如果你是小白,也就是说,你连常见的数据结构,如链表、树以及常见的算法思想,如递归、枚举、动态规划这些都没过,那么,我不建议你盲目疯狂着去刷题的。而...
  • 先说答案建议先C语言,掌握基本的语法基础后,再数据结构与算法,C语言编程与数据结构和算法这两个完全是两个东西了。 学习数据结构和算法有一个很重要的前提,就是至少熟练掌握一门编程语言,编程语言掌握肯定...
  • 学算法有什么用?唉,对你来说,可能真没用

    千次阅读 多人点赞 2019-03-24 08:30:00
    作者 | liuyubobobo来源 |是不是很酷我以前一直认为,学习计算机,必须要懂算法,不仅要懂算法,还应该要“精通”算法。在我大一的时候,曾看过李开复老师的一篇著...
  • 学习人工智能需要具备最最最总要的是学习态度和学习能力,毕竟是前沿科学行业,其次才是数学知识和编程能力,数学知识如果你是做学问做算法突破,那么对于你的数学能力要求是相当高的,如果是做工程等,数学这块要求...
  • 实验课上写的,有更好的想法可以提出,大家一起学习,赚点积分不容易 C语言编写,调试过可运行,含实验报告,含具体流程图 ,有注释和变量解释,环境为VS2008 安徽大学操作系统实验(八)基于扫描的磁盘调度算法,...
  • 粒子群优化算法

    千次阅读 多人点赞 2018-12-02 18:23:02
    文章目录粒子群优化算法1、简介2、思想粒子群优化算法分析粒子群优化算法应用总结 粒子群优化算法 1、简介 粒子群算法,也称粒子群优化算法或鸟群觅食算法,英文为:Particle Swarm Optimization,缩写为 PSO, 是由...
  • 机器学习算法 综述(入门)

    万次阅读 多人点赞 2019-06-16 21:59:28
    学习了一个学期机器学习算法,从什么都不懂到对十个机器学习算法有一定的了解,下面总结一下十大机器学习算法,从算法的概念、原理、优点、缺点、应用等方面来总结,如果有错误的地方,欢迎指出。 目录 1.决策树...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 411,466
精华内容 164,586
关键字:

容易学的算法