新普金娱乐网址


假诺早期银时没遇到新八,银魂的故事会如何?

bzoj 1701 [Usaco2007 Jan]Cow School牛校园

[数学趣味001数学]RSA算法原理及示范

  • 一月 27, 2019
  • 数学
  • 没有评论

String

  • 字符串中得以涵盖由反斜杠\和字符构成的特殊字符,如\n换行,\b
    退格,\f 换页,\r回车,\tTab;

var multiLine = " first \n second \n third line "
alert(multiLine) // alerts 3 lines
  • “”当做转义符号也可以防止有些题材,如

var str = 'I\'m the Valrus'
  • 当总结字符串长度时,特殊字符也会到场计算,如:

var str = "My\n" // 3 .`\n`也算其中之一
alert(str.length)  // 3
  • javascript中的字符串只好读取不可以改变;
  • javascript中有二种查找子字符串的艺术,indexOflastIndexOf,重返找到的率先个字符的地方,没找到重返-1;
  • 逐位运算符~not,~n相当于 -(n+1),if ~indexOf相当于if found;
  • 获取子字符串的三种方法substr, substring, slice,可以谷歌(Google)找到它们中间的差异,也得以从后文链接中找到;
  • 字符串的笔记
  • 字符串逐位相比较,一旦比较出大大小小就不再未来相比较;"Bob" > "Bar" // true, because o > a,alert("2" > "14"); // true
  • 字符装换为ASCII码相比较
  • 当有数值参预相比较时,会把字符串也转移为数值,如alert(2 > "14"); // false

可以先看看这些录像:
RSA_Encryption_Algorithm

Number, Math

  • JavaScript中的数值拔取双精度(IEEE 754),每个数占8byte;
  • JavaScript可以辨认十六进制(0xFF),八进制(010)以及科学计数方法的数字(3e5);
  • Infinity-Infinity是七个特殊的值,它们大于或小于任何值,对它们进行演算后依旧会获得Infinity,二者相除会拿到NaN,并不会报错;
  • 当一个数学运算符不可能被科学履行时会得到NaN(0/0),它不对等包罗其本人的其余数值,只可有isNaN函数检查;
  • 除开双向的加号,别的具有的运算符都会把数值格局的字符串转换为数值;alert( -"12.34" / "2" ) // -6.17;
  • 不能转换则赶回NaN;
  • 一个由空白符组成的字符串会被转化为0;
  • 要是字符串首字母非数字,parseInt/parseFloat会返回NaN,alert( parseInt('a123') )//NaN;
  • JavaScript中的数值统计存在精度问题(alert(0.1 + 0.2 == 0.3)//false)(浮点数无法被二进制精确的意味),解决方法可以先转化为整数,再除以10alert( (0.1*10 + 0.2*10) / 10 ) // 0.3,也得以采取toFixed;

公开密钥

Perwork:
私钥:Sender和Receiver预先约定加密和平解决密方案,向其余人保密。
其一完毕比较难:向其外人保密。倘诺你是个合营社,很几人要和您关系,发送者可能和您或多或少提到也未尝,怎么保密。
需求:Sender素不相识,发送音信必要保密,加密方案必须公开。【就和邮箱一样,所有人都得以向你当众的的信箱里投信件,不过只有你才有钥匙(私有的)取信件】
公钥:加密方案向所有人公开,解密方案唯有Receiver知道,对其他所有人(包蕴Sender),Sender和除Receiver外所有人都是同等的,【Sender把信件放入Receive信箱了,Sender就无法再收看信件内容啦】

那就必要加密很不难,不过解密很难的算法!从跳板里跳入水里不难,想跳回去就不是那么不难呀。

先用一下演示讲下流程:


  1. 概念一个消息集合

    Zset={0,1,2,3,…90}.

那个就是一对一于26个英文字母,只要领会那26个假名,你就足以拼出任何想要的信息,只是我们把26个增添为了91个。

  1. Sender 要发送的新闻为

    %%现实生活中:
    Msg = ”晚上一并吃饭”;
    %%等价为新闻集合里是:只要Reciver得到的情节最后为{1,2,3,4,5,6}就可以清楚是有血有肉的“中午同步用餐”
    Msg ={1,2,3,4,5,6};

那边的Msg就是一个公开。

  1. Sender 把新闻编码为明文后,还要开展加密!

把公开的每一个因素都映射为另一个唯一的值(密文:可以公开的值)

 

%%明文
Msg = {1,2,3,4,5,6};
%%使用加密:C = A^5(mod 91)
%%A^5 -->
NewMsg = {1,32,243,1024,3125,7776}
%%mod 91  对91取余得到密文
NewMsg = {1,32,61,23,32,41};

大约来说:加密进程为:

%%  明文             公式:5次方后对91取余         密文
     A -------------> A

5

 mod 91 -------------->C

说到底的承保:A和C相对是一对一映射涉及。

Question1: 那么那个密文怎么确保不被破解呢?

我们试下从那公开的加密公式和密文反推之

数学 1

可以阅览,通过穷举,大家仍旧得以获取结果的,但这些计算次数也是指数进步的,且计量开根号得整数操作很要耗时,

一个算法最后逼得人只可以用穷举来解密,那么就是成功啦,

思考:假定公式里面不是5次方,而是三位数,四位数的次方,那总括量就更大。

3 . sender把那密文发给Receiver 加密工作做到

  1. 解密:Receive知道音信比Sender多的就是其一91是怎么来的,那些是重中之重。

4.1 91 = 7*13
(完毕采取中,会设定为2个要命大的素数相乘,让Sender看不出是哪2个素数来,大家为了演示简单,假定Sender不会赢得91=7*13这几个结果,唯有Receiver知道)

这些算法就是应用了那或多或少:2个素数乘积的结果很不难,不过想转头把结果反推为哪2个素数相乘很难。所有公开密钥都是正着做简单,反过来就是很难

4.2
根据费马小定理:和折腾相除法能够获得:

5d = 1+(13-1)*(7-1)*k

从以上可以“不难穷举出一个”k=2时 :5*29 = 1+(13-1)*(7-1)*2

4.3 接着大家对密文C再乘29次方后对91取余就可以直接获得明文啦

数学 2

你一旦知道这几个29,就足以博得破解啦!!!!!

是或不是很神奇!!!!!!当然大家仍旧有许多迷惑的,比如:

缘何选5,91,那一个数字有哪些要求?接下去,大家先理一下方面的步子:

 

步骤 示例
取2个大质数:p,q p=7,q=13
密钥:n=p*q,h 是一个与(p-1)(q-1)互质的数, 公开n 和 h ,p,q不公开 n =91,h = 5(与72互质)
加密(公开)C = Ah (mod n) A = 明文,h=5,n=91,C= 密文
解密(保密)hd = 1+(p-1)(q-1)k—->A = C d mod 91 5d = 1+72*k, 当k=2时,d=29成立
解密完成 密文乘方29 再对91取模 得到明文

 

规律注解 :

  1. 取2个很大的不对等的质数p,q ;

  2. m = p*q

3.
根据欧拉函数:比m小的质数个数r
= φ(N) = φ(p)*φ(q) = (p-1)*(q-1)

  1. 分选一个与R互质的数e

5.
根据欧几里德(辗转相除)定理:2个互质的数一定知足:e*x
– r*y =1;

  1. 上式等价为: e*d – r*k = 1;

7.密文c ,明文a , 加密 a e = c (mod m);

  1. 解密: c d = a (mod m),那个结论是
    我们要表明的,

  2. cd = ae\*d = a 1+r\*k =a*a
    r\*k

故而若是表达: a*a r\*k = a(mod m) —->a
r\*k = 1
(mod m)

10
.根据费马小定理:

数学 3:

a r\*k = (a k)r = 1 (mod m).


数学真有意思…….

Array

  • shift,pop剔除对应项,并回到该项;
  • unshift,push;
  • join,split;
  • 比方给数组的length赋值低于数组实际的长短,会删除当先的项;
  • push,pop平昔操作最终一项,其运作速度快,作用高;
  • shift,unshift操作第一项,必要牢记整个数组,功用低;
  • 数组中的length方法(属性) 其实是last index+1,

    var fruits = [] // empty array
    fruits[1] = 'Peach'
    fruits[99] = 'Apple'
    alert(fruits.length)  // 100 (but 2 elements)
    
  • 对数组也可以利用delete,不过只会删除该项的值,不会真正删除该项;

  • splice在原数组上转移和slice重回原数组的一个有些(新数组);
  • sort默许把内容转化为string,然后根据ASCII码相比较;
  • new Array再次回到的是负有指定长度的值为空的数组;

Objects

  • obj.propobj[prop]两者都得以访问对象中的一项,不过值得注意的是obj.prop里prop是该项的称号,obj[prop]里的prop是该项的值,此时prop是字符串,应该加引号;
  • alert("key" in obj) // true, key exists使用in运算符可以用来规定是或不是存在某一项;
  • 使用for in时,子项处理顺序不确定,差距浏览器有所差别;
  • 目标中得以储存所有类型,包涵函数;
  • 能够行使对象完成链式调用,其关键在于每一次的重临值为this;

var ladder = {
  step: 0,
  up: function() {
    this.step++
    return this
  },
  down: function() {
    this.step--
    return this
  },
  showStep: function() {
    alert(this.step)
    return this
  }
}
ladder.up().up().down().up().down().showStep()  // 1
  • 使用构造函数创设对象时,var animal = new Animal()var animal = new Animal等同;
  • 利用构造函数创造对象时,其关键在于this,若是构造函数再次来到了一个目的则会忽略this;
  • JS中存在Math,Date,RegExp两种内置对象,函数从某种程度上来说也是目的,String,Number,Booleans三者相比奇特,它们分别拥有一些主意;

对象转换为简易数据类型

倒车为字符串

  • 若果目的中设有toString方法,且重返一个粗略类型数据,那么就回来那几个字符串(所有数组默许拥有,所以一般实施到此为止);
  • 默认

alert( {key: 'value'} ) // toString for Objects outputs: [object Object]
alert( [1,2] )          // toString for Arrays lists elements "1,2"
alert( new Date )       // toString for Dates outputs the date as a string
  • 可以自己定义一个toString方法

  var user = {
    firstName: 'John',
    toString: function() {
      return 'User ' + this.firstName
    }
  }
  alert( user )  // User John
  • 即使存在valueOf方法,且重返一个简短类型数据,那么再次回到那一个;
  • alert()会触发装换为字符串

转换为数值(三种意况下暴发,非平常见)

  • 对数值举行测算的主意(
    Math.sin(obj),isNaN(obj))以及运算符(+,-,*,/等等)
  • 做相比较时(注:obj1==obj2,只有双边引用同一对象时才相当于);Number(obj)也会更换,
  • 数值转换规则如下

    • 若是存在valueOf方法,且再次回到一个不难类型数据,那么重临这么些结果;
    • 假若目的中留存toString方法,且重临一个简便类型数据,那么就回到那个字符串;

    alert( new Date() ) // The date in human-readable form
    alert( +new Date() ) // Microseconds till 1 Jan 1970
    
    • 投机定义一个valueOf方法

      var room = {
        num: 777,
        valueOf: function() {
          return this.num
        }
      }
      alert( +room )  // 777
    
    • 不存在valueOf方法,可是存在toString方法时会调用此办法

      var room = {
        num: 777,
        toString: function() {
          return this.num
        }
      }
      alert( room / 3 )  // 259
    
    • 在意只须要回到不难数值类型即可(Numeric,String,Boolean),不必然非要重临数值;

装换为布尔值

  • 装换表
    |Value | Converted to…|
    |:——|:———-|
    |true/false | no conversion|
    |undefined, null | false|
    |Number | 0, NaN become false, others – true.
    |String | “” becomes false, any other – true|
    |Object | true|

  • 注意,字符”0″为true;

  • 涉及到逻辑运算符会触发表尔装换;

  • 可是也有比较奇怪的地点,看下边两例

  alert( [0] == 0 )  // true
  alert( "\n0\n" == 0 ) // true
  alert( "\n0\n" == false ) // true
// 

  if ([0]) alert(1)  // 1, if treats [0] as true
  if ("\n0\n") alert(2) // 2, if treats "\n0\n" as true
  • 周详考虑什么转移的,就可以清楚了。==只比较值得结果,[0],“0”装换为数值后就是0,可是当她们是数组中的一项,或字符串时毫不是空的。

再看一个比较奇怪的例子

alert( [] == ![] ) // true
```分析一下这个例子有利于更加好的理解类型装换
- 首先,看右边![],逻辑非对[]进行布尔转换,依据上面的装换表,数组其实也是对象,object装换为真。所以右边![] = !true = false;
- 再看左边,对象与简单类型比较时,会按数值方式装换,没有valueOf,将使用toString进行装换(以逗号分隔的字符串)那么就装换为一个空的字符串''=false;
- 所以二者相等;

检测一下你是否真的掌握了数值装换,看看下面的题目能不能理解

```javascript
6 / "3" = 2
"2" * "3" = 6
4 + 5 + "px" = "9px"
"$" + 4 + 5 = "$45"
"4" - 2 = 2
"4px" - 2 = NaN
7 / 0 = Infinity
{}[0] = undefined
parseInt("09") = "0" or "9" // octal or decimal, depends on the browser
5 && 2 = 2
2 && 5 = 5
5 || 0 = 5
0 || 5 = 5

说明

本文对各个型并未做详细的评释,想询问越多材料可以参照以下小说

相关文章

No Comments, Be The First!
近期评论
    分类目录
    功能
    网站地图xml地图