运算速度

分组密码体制【密码学笔记】

与世无争的帅哥 提交于 2019-12-04 01:58:36
分组密码的基本概念 ​ 分组密码在加密过程中不是将明文按字符逐位加密,而是首先要将待加密的明文进行分组,每组的长度相同,然后对每组明文分别加密得到密文。加密和解密过程采用相同的密钥,称为对称密码体制。 ​ 例如将明文分为 \(m\) 块: \(P_{0},P_{1},P_2,…,P_{m-1}\) ,每个块在密钥作用下执行相同的变换,生成 \(m\) 个密文块: \(C_0,C_1,C_2,…,C_{m-1}\) ,每块的大小可以是任意长度,但通常是每块的大小大于等于64位(块大小为1比特位时,分组密码就变为序列密码)。 如下图所示是通信双方最常用的分组密码基本通信模型。 ​ 一个分组密码系统(Block Cipher System,简称BCS)可以用一个五元组来表示: \(BCS=\{P,C,K,E,D\}\) 。其中,P(plaintext)、C(ciphertext)、K(key)、E(encryption)、D(decode)分别代表明文空间、密文空间、密钥空间、加密算法、解密算法。 设 \(X=\{x_0,x_1,…,x_{n-2},x_{n-1}\}\) 为一组长度为 \(n\) 的明文块,在密钥 \(K=\{k_0,k_1,…,k_{t-1}\}\) 的加密作用下得到密文块 \(Y=\{y_0,y_1,…,y_{m-2},y_{m-1}\}\) ,其中 \(x_i,y

c++ 面试(100题刷题)

陌路散爱 提交于 2019-12-04 01:53:39
目录 1.C++与C的差异 1.1 C与c++中的struct的差异 1.4 c与c++ 不同之处 1.5 指针与引用的区别 1.6 sizeof 1.7 static 的作用域 1.8 c++ 中值传递的三种方式 1.9 inline 函数 1.10 virtual与inline 1.11 Debug和Release的区别 1.12 assert 1.13 const 与#define 1.14 malloc/free 与 new delete 1.15 动态申请内存耗尽 1.20 const 1.21 判断系统是多少位系统 1.22 1.23 1.24 实参与形参 1.25 计算精度误差 1.26 堆和栈 1.27 explicit与protected 1.28 浅拷贝与内存泄漏 ,深拷贝 1.30 数组名作为参数与int 作为参数的区别 1.31 程序的可读性与可维护性-变量 1.32 const 的用法 1.33 virtual 是如何实现多态的? 1.34 面向对象三大特性 1.35 重载 ,重写 ,重定义 1.36 一个空类的对象占的字节数 1.37 内联函数是否参数检查 1.38 析构函数与虚函数 1.40 c++模板编程的理解 1.41 函数模板与类模板 1.41 运算符重载 1.42 基类的析构函数为什么必须是虚函数? 1.43 c++的左值与右值 1.44

快速看懂HashMap

余生颓废 提交于 2019-12-03 19:49:14
在开始之前,先过一遍本博客的重点 • HashMap寻值的速度快是因为HashMap的键会被映射成Hash值,从而避开用equal方法遍历来加快寻值速度。 • HashMap有初始容量和加载因子两个参数来控制性能。当条目大于容量*加载因子时,容量翻一倍。 • HashMap和Hashtable的区别在于线程安全性,同步,以及速度。 下面开始正文 1.HashMap的具体实现 Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示: HashMap中我们最常用的就是put(K, V)和get(K)。我们都知道,HashMap的K值是唯一的,所以查询和修改数据的时候只要用equal遍历所有的key值就可以了,但我们知道直接遍历查询的时间复杂度为O(n),在数据量比较大时效率不高,所以在java中运用Hash算法来对所有的key进行运算加入数组中。查询的时候直接用数组下标来访问数据(时间复杂度变成了O(1)),以此绕开了用equal遍历带来的效率损失。 HashMap根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null

计算机的运算方法

邮差的信 提交于 2019-12-03 15:25:36
计算机的运算方法 无符号数 计算机中的数存放在寄存器中,通常将寄存器的位数称为机器字长, 大家说的无符号数其实就是不区分正负号的数,换句话说,就是没负数,全是正数,大家知道,计算机中的数是以0-1存储的, 假如我们的寄存器16位, 无符号数表示的范围就是0~65535 (2^64=65536), 有符号就是分正负数,总数65536就被分成两半,一半正数,一般负数,范围就是 -32768~32767 有符号数 有符号数,就是正负数同时存在, 人们固然能区分开整正负数,计算机怎么区分呢? 前面说了,计算机只认识01这样的数,于是人们规定 0表示正数, 1表示负数, 于是这样符号就被数字化了, 并且规定将其放在真实值前面, 于是有符号数就诞生了 如上图,按照计算机存数数据的特性将符号数字化, 数字化后的编码方式得到的结果称为 机器数 , 将带有+-符号的数字称为 真值 既然现在将有符号数数字化后,新的问题来了,当这些机器数之间需要进行运算时, 符号位怎么办? 符号位能否参加机器数之间的运算呢? 如果说,需要参加运算又需要哪些处理才能消除符号位对计算结果的影响呢? 这一连串问题就引出了符号位和数值位所构成的编码: 原码 , 补码 , 反码 , 移码 其实在学习的过程中该一直问自己,自己在干什么??? 就比如现在,我在前面大概说了说计算机是如何表示数字的,于是认识了机器码

C博客作业03--函数

假如想象 提交于 2019-12-03 09:58:14
1.展示PTA总分 函数: 2.本章学习总结 2.1. 学习内容总结 1.函数的定义 函数是一个完成特定工作的独立程序模块,包括库函数和自定义函数两种。例如,scanf()、printf()等为库函数,由C语言系统提供定义,编程时只要直接调用即可;而有时,我们需要一些能实现特定功能的函数,这时就需要用户自己定义,属于自定义函数。从函数实现计算功能角度来看,C语言的函数与数学上的函数概念十分接近。在C程序中必然为某一种数据类型,称其为函数类型。 函数定义的一般形式为: 函数类型 函数名(形式参数表) /*函数首部*/ { 函数实现过程 /*函数体*/ } 1.函数首部 函数首部由函数类型、函数名和形式参数表(以下简称形参表)组成,位于函数义的第一行。函数首部中,函数名是函数整体的称谓,需用一个合法的标识符表示。函数类型指函数结果返回的类型,一般与return语句中表达式的类型一致。形参表中给出函数计算所要用到的相关已知条件,以类似变量定义的形式给出,其格式为: 类型形参1,类型2 形参2,…,类型n形参n 形参表中各个形参之间用逗号分隔,每个形参前面的类型必须分别写明。函数的 参的数量可以是一个,也可以是多个,或者没有形参。 函数首部后面不能加分号,它和函数体一起构成完整的函数定义。 2.函数体 函数体体现函数的实现过程,由一对大括号内的若干条语句组成,用于计算,或完成特定的工作

数据结构课设:高精度算法

匿名 (未验证) 提交于 2019-12-03 00:18:01
高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。 . 由于计算机运算是有模运算,数据范围的表示有一定限制,如整型int(C++中int 与long相同)表达范围是(-2^31~2^31-1),unsigned long(无符号整数)是(0~2^32-1),都约为几十亿.如果采用实数型,则能保存最大的double只能提供15~16位的有效数字,即只能精确表达数百万亿的数.因此,在计算位数超过十几位的数时,不能采用现有类型,只能自己编程计算。 ―― [ 百度百科 ] 题目 : ① 整数长度在一百位以上 ② 实现两长整数的加减乘除操作,除法要返回商和余数 ③ 输入输出均在文件中 高精度计算时一般用一个数组来存储一个数,数组的一个元素对应于数的一位(当然,在以后的优化中为了加快计算速度,也可用数组的一个元素表示数的多位数字),表示时

壹.入门术

巧了我就是萌 提交于 2019-12-02 22:42:40
一 编程与编程语言 二 编程语言分类 三 主流编程语言介绍 四 python介绍 五 安装python解释器 六 第一个python程序 七 变量 八 用户与程序交互 九 基本数据类型 十 格式化输出 十一 基本运算符 十二 流程控制之if...else 十三 流程控制之while循环 十四 流程控制之for循环 十五 开发工具IDE 十六 扩展阅读 十七 作业 一 编程与编程语言 python是一门编程语言,作为学习python的开始,需要事先搞明白:编程的目的是什么?什么是编程语言?什么是编程? 编程的目的: #计算机的发明,是为了用机器取代/解放人力,而编程的目的则是将人类的思想流程按照某种能够被计算机识别的表达方式传递给计算机,从而达到让计算机能够像人脑/电脑一样自动执行的效果。 什么是编程语言? #上面提及的能够被计算机所识别的表达方式即编程语言,语言是沟通的介质,而编程语言是程序员与计算机沟通的介质。在编程的世界里,计算机更像是人的奴隶,人类编程的目的就命令奴隶去工作。 什么是编程? #编程即程序员根据需求把自己的思想流程按照某种编程语言的语法风格编写下来,产出的结果就是包含一堆字符的文件。 #强调:程序在未运行前跟普通文件无异,只有程序在运行时,文件内所写的字符才有特定的语法意义   所以我有话对大家说 View Code 二 编程语言分类 编程的语言的发展经历了

位运算

匿名 (未验证) 提交于 2019-12-02 21:53:52
1.什么是位运算: 程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。?、 C++提供了6种位运算符来进行位运算操作: 位运算的操作数是整数类型或字符型. 按位与&运算 将参与运算的两操作数各自对应的二进制位进行与操作。例如:6的二进制是110,11的二进制是1011,那么6 & 11的结果就是2? ------------ & 运算常常用来将某变量的某些位清0,而保留其它位不变。例如,需要将int型变量n的低8位全置成0,而其余位不变,则用: & 也常用于二进制取位操作,例如一个数 & 1的结果就是取二进制的最末位。如果要判断n的第8位(从右往左,从1开始数)是否是1,则用 附注:int型是32个二进制位,16进制整数每个数字代表4个二进制位,故16进制int型常量最多是8位。 ------------ 按位异或^运算 ^运算通常用于对二进制的特定一位进行取反操作.例如n^0xff就使得n的最后8位取反。 ----------- ^运算的特点是:如果a^b==c,则有a^c==b和c^b==a ^可用于简单加密, 左移<<运算 a << b就表示把a转为二进制后左移b位(在后面添b个0)。例如100的二进制为1100100,而110010000转成十进制是400,那么100 << 2 = 400。可以看出,a <<

CORDIC算法基本原理

▼魔方 西西 提交于 2019-12-02 08:40:31
引言 某些复杂的计算,例如三角函数和除法运算等涉及到大量浮点运算的计算任务,是数字电路天生的瓶颈所在。在某些场景下,可以使用查找表方法或者采用级数展开的方法来实现三角函数等运算功能。但是,这两种方法可能会占用大量的存储资源和硬件乘法计算单元,而想要节省资源,就要以牺牲精度为代价。 相对于前两种方法,CORDIC算法具有很大优势。首先,在计算过程中,它不使用任何的硬件乘法器单元,所涉及的只有移位和累加。然后,对于存储资源的占用,它仅仅需要少量的数据需要预先存储。在实际的数字电路设计中,可以将其设计为流水线方式或者是迭代复用方式,以提高运算速度或者是减少资源占用。 一、矢量旋转公式 CORDIC算法最最基本理论基础,是矢量旋转公式。即矢量 A ( x , y ) A\left( {x,y} \right) A ( x , y ) 顺时针旋转 θ \theta θ 之后,得到的矢量 ( x ′ , y ′ ) \left( {x',y'} \right) ( x ′ , y ′ ) 可以表示为 (式1) : x ′ = x cos ⁡ θ + y sin ⁡ θ , y ′ = y cos ⁡ θ − x sin ⁡ θ . \begin{array}{l} x' = x\cos \theta + y\sin \theta ,\\ y' = y\cos \theta - x\sin

关于==、equals和hashCode详解

青春壹個敷衍的年華 提交于 2019-12-02 06:32:57
这几天在尝试手撸一个类似Lombok的注解式代码生成工具,用过Lombok的小伙伴知道,Lombok可以通过注解自动帮我们生产equals()和hashCode()方法,因此我也想实现这个功能,但是随着工作的深入,我发现其实自己对于equals()和hashCode()的理解,也处在一个很低级的阶段。 因此痛定思痛,进行了一番深入学习,才敢来写这篇博客。 文章目录 1、equals在Java中含义 2、hashCode在Java中的作用 3、为什么hashCode和equals要一起重写 4、扩展:实现科学的哈希函数 1、equals在Java中含义 首先要解释清楚这个,equals方法在Java中代表逻辑上的相等,什么叫逻辑上的相等?这个就涉及到Java本身的语法特性。 我们知道,Java中存在着==来判断基本数据类型的相等,但是对于对象,==只能判断内存地址是否相等,也就是说是否是同一个对象: int a = 10000; int b = 10000; // 对于基本数据类型, == 可以判断逻辑上的相等 System.out.println(a == b); Integer objA = 10000; Integer objB = 10000; Integer objA1 = objA; // 对于类实例, == 只能判断是否为同一个实例(可以视为内存地址是否相等)