《道怪异仙》是一部流行的网络小说。
其间,剧情叙述了男主角李火旺穿越到怪异国际,但认识时不时会回到本来的现代社会中。两个国际时不时交织,男主角陷入到了紊乱当中,一向在疑问究竟哪边国际是实在的,也因此发展出了精彩的故事。
那么,作为一个程序员,假如面对这样的处境,有没有办法使用专业知识区分国际是否是实在的呢?
其实不管什么样的异国际,数学始终不变,咱们能够使用密码学背面的数学原理,来检查一个国际是否是实在国际。
在剧情中,男主角李火旺一向怀疑他所处的“现代国际”是错觉,那么,咱们很简略想到,错觉没办法伪造算力,只要咱们结构一个需求必定算力的数学问题,再交给“现代国际”的女主角杨娜去找核算机核算就能够了。
可是考虑到书中”怪异国际”并没有关于核算的神通,其数学发展水平也有限,所以咱们结构出的问题应该是难以核算,可是又易于查验的。这样的问题与密码学所需的数学原理十分类似,咱们能够使用一个简略的事实:
核算两个大质数的乘积十分简略,可是把两个大质数的乘积质因数分化却十分困难。
所以咱们能够规划这样一个方案:
- 首要教会”怪异国际”一侧的女主角白灵淼学会基本算术(只要到整数乘法就能够了)。接下来,指挥白灵淼生成两个大质数,而且把它们的乘积告知男主。
- 待男主穿越回“现代国际”,把这个乘积告知”现代国际”女主角杨娜,请她去找核算机核算它的质因数分化,之后再告知男主。
- 男主回到怪异国际,检查”现代国际”给出的质因数分化成果是否正确,假如正确,那么”现代国际”必定是实在的。
那么,如何在基础算术之内,生成较大的质数呢?咱们能够使用费马小定理:
假如p是一个质数,而整数a不是p的倍数,则a^(p-1) 除以p余1 。
实际上,取a为偶数,ap−1p+1a^{p-1} \times p+1在多数情况下都是质数。在不那么严厉的情况下,咱们完全能够把这些伪质数当作质数来使用。
针对验证国际是否存在算力的场景,咱们只需求挑选两个大约几十万的整数就能够了,比方:
6^{7-1} * 7+1 = 326593
假如怕踩到坑,能够拿一些小质数试验一下。
之后咱们核算它们的乘积,得到了 3386148883333861488833
这些核算量稍微有点大,可是应该还在小白的能力范围内,最多花上一个小时,满足完结核算了。
留意,为了避免错觉作弊,小白只告知李火旺最终的乘积,不需求告知李火旺两个质因数。
接下来,让咱们的主角回到”现代国际”,把3386148883333861488833交给”现代国际”女主角杨娜,要求她找核算机和程序员对33861488833做因式分化。
接下来杨娜大约要花一点钱,比方她找到了winter,因式分化的代码这样写:
let p = new Array(Math.ceil(Math.sqrt(33861488833))).fill(1)
p[0] = 0;
p[1] = 0;
for(let i = 2; i < p.length; i++) {
if(i === 0)
continue;
if(33861488833 % i === 0)
console.log(i);
for(let j = i * 2; j < p.length; j += i)
p[j] = 0;
}
//运行成果:103681
用核算机核算这个循环只需求几秒,可是假如是人肉核算,这个工作量几乎是不行完结的。
错觉再怎样凶猛,也不行能协助李火旺超越数学,算出这个因式分化的成果。
假如在”现代国际”中,算出了正确的因式分化成果,因为李火旺本人并不知道质因数,所以能够确认不行能是李火旺的错觉。
这样就能够验证”现代国际”的实在性了。
换句话说,即便”现代国际”是错觉,那也是一个有巨大算力的错觉系统,那么《道怪异仙》的故事可能就变成另一种风格了。