卜踆哉数对

阿里笔试题—卜踆哉数对

今天下午做完网易笔试题,然后5点准备做腾讯的面试题,然后发现只是模拟试卷,汗!-_-!!言归正传,晚上阿里试题题目是卜踆哉数对,网上也没有相关资料。(怕不是阿里程序猿现编的数学数对,雾2333333)最后虽然好像找到了一条路径,但还是没时间去实现了。(40分钟真是短~~~)本文介绍一下我的思路(有可能并不好hhhhh)

目录


题目

实数数对 (b1+b21) 在数学上称之为卜踆哉数对,又称为B数对,他们有很多有趣的数学特点,其中参数b称之为该数对的b因子。比如3.15晚会的月份和日期就组成一个B数对,对应的b因子为4。在一些工程领域,经常需要计算对 (b1+b21)c%d 的值,其中为向下取整。请根据参数(b, c, d),计算该数据的值。 1b10000,1c10000,1d10000

过程

初来乍到

其实一开始看到这道题是懵比的。我暴力求解能算出多少?所以直接套公式编程计算。第一次结果只有40%,感觉有点低。就开始想是不是要做化简什么的。因为括号内的内容是 (a+a(a+2)) ,所以接下来就是一大堆的因数分解啊,变换啊什么的。结果没做好,想想再把程序改了吧。然后在改程序的时候发现忘记开根号了-_-!!!这也能过40%!!!!Are you kidding me !!!!改好之后一验证。果然,完整的套公式解法对于测试用例有60%是可行的。然后没办法了,才60%呀。那就只能再回归公式,这时候只剩下25分钟了。我注意到后面的取模符号%,就在想这题有没有可能是在取模符号上做文章?说到取模符号,我有想到上个礼拜在上信息安全课,老师在讲公钥密码机制的RSA算法的时候,有讲到过使用初等数论知识进行人为计算公私钥加解密的内容。

RSA内容

RSA密码体制的描述

密钥生成算法:每个用户执行以下操作
随机生成两个不同大素数p,q;
计算 n=pq,ϕ(n)=(p1)(q1) ;
随机选取整数e, 1<e<ϕ(n) ,满足 (e,ϕ(n))=1 ;
利用扩展欧基里德算法求出满足 ed=1 mod (ϕ(n)) 的整数d;
公开(n,e),保密 (p,q,ϕ(n),d) 。其中e就是加密密钥,而d就是解密密钥,n称为模数。

RSA加解密:若B要利用A的公钥进行加密,则B执行

获得A可信的公钥(n,e);
把消息按分组的方式表示为区间[0,n-1]之间的整数m;
计算 c=me mod n ;
将密文c发送给A;
解密:为从c中恢复明文m,A利用解密密钥d,计算
m=cd mod n

例如:

取p=7,q=17,则
n=pq=7×17=119
ϕ(n)=(71)(171)=6×16=96
任取e=5,则d=77.注意 5×77=385=1 mod 96

假设m = 19,
c=195mod119=19×(192)2mod119=19×3612mod119=19×42mod119=304mod119=66mod119
c=66
以上结果只需要了解一下模运算的相关知识应该不难得到。

想法

那么这个有什么关联吗?当时也是抱着试试看的想法,比较了一下。因为上面的计算内容其实是计算 ac mod d ,因为在c只有“一般大”(相较于计算机而言)的时候,我们人类就算不出上面的东西了,太麻烦!那怎么办?上面是先将acmod d 变成(a2)c2 mod d 。我们计算平方还是能算算的~

  • 那么如果这个a2==d 不用算啦,值就是0;

    • 如果这个 a2>d 对它先进行取模运算。也就是说 (a2)c2modd==(a2modd)c2
    • 上面的过程其实就是一直在做这样的事情。

      那么既然上面的方法对我们人类计算很有用,那么对于计算机计算有没有用呢?

      其实上面的过程就是认为c在很大的时候,计算很麻烦。先做部分幂s(上例中s = 2),比较 cs 与d。然后做取模运算( asmodd )得到新的底数 E ,原式变为Ecsmodd,重复循环。知道我们认为“原式”已经足够简单计算。

      题目思路

      这个想法启发了我。说了这么多终于开始介绍题目思路了:

      我认为题目中最影响运算的就是幂运算 c

      介绍图1

      如果计算完成ac 需要的时间是t,我认为计算完成 ac2 的时间是小于 t2 的。如果设 E=ac2 ,那么在 c 很大的情况下,E 也是一个大数。所以我套用上面的方法,对 E 这个大数取模,使它变为小于d 1d10000 的一个相对“小数”。重复操作至设定的一个阈值结束。

      介绍图2

      介绍图3

      这样做,是把在 c <script type="math/tex" id="MathJax-Element-52">c</script> 次幂运算中,运算到幂函数“爆炸临界点”的时候。对底数取模,使底数变“小”,使底数再次远离临界点,提高运算效率。

      总结

      当然上面这只是一个粗糙的思路,有很多细节还没有说完(原式中的取整没有考虑啊,爆炸临界点的选取啊,最终结束阈值的确定啊等等)。但是我还是会好好地把这个内容完善的。写了一个上午,第一次用MarkDown写,但是感觉它真的是个好工具!
      当然,上面我所说的也有可能就是个错误的想法(23333333333)。

      有问题请mailto:sevancozhang@gmail.com 。


评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值