ARTS-10
Algorithm
引言
做了太多的二叉, 本来想着尽量做一些从数学上的高效求解的题目, 但是我的博客数学公式渲染有问题,我还没能搞定, 所以这次来个DP问题。
Description
You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
Note: Given n will be a positive integer.
Example 1:
Input: 2
Output: 2
Explanation: There are two ways to climb to the top. 1. 1 step + 1 step 2. 2 steps
Example 2:
Input: 3
Output: 3
Explanation: There are three ways to climb to the top. 1. 1 step + 1 step + 1 step 2. 1 step + 2 steps 3. 2 steps + 1 step
大意
有一个n层的楼梯, 每次你可以迈一层或者两层, 问, 爬到楼梯顶部一共有多少种走法。
思路
典型的动规问题。虽然也有其他一些不同的解法, 例如穷举, 但是效率太低,并不合适。
这里具体不再展开, 本篇解法会在Share当中分享。
Code
代码可以更加精简, 基本4~5行就能够完成, 但是我为了尽量通过代码能体现思路, 按照思路的进行续来编码。
1 |
|
Result
Success Details
Runtime: 4 ms, faster than 87.64% of C++ online submissions for Climbing Stairs.
Memory Usage: 8.2 MB, less than 78.25% of C++ online submissions for Climbing Stairs.
Time Submitted | Status | Runtime | Memory | Language |
---|---|---|---|---|
a few seconds ago | Accepted | 4 ms | 8.2 MB | cpp |
Review
Tips
RSA 非对称加密算法原理
欧拉函数
在数论中,对正整数n,欧拉函数 \(\varphi(n)\) 是小于或等于n的正整数中与n互质的数的数目。此函数以其首名研究者欧拉命名,它又称为φ函数(由高斯所命名)或是欧拉总计函数(totient function,由西尔维斯特所命名)。 欧拉函数
RSA 算法的核心: 欧拉定理
. > 在数论中,欧拉定理(也称费马-欧拉定理或欧拉 \(\varphi\) 函数定理)是一个关于同余的性质。欧拉定理表明,若 n,a为正整数,且 n,a 互素(即 \(\gcd(a,n)=1\) ),则
\[\begin{equation}a^{\phi{\left(n\right)}} \equiv 1 \pmod n \end{equation}\]
费马小定理: 欧拉定理的特例
费马定理的表达式 :
\[ a^{\phi{\left(n\right)}} \equiv 1 \pmod n \]
在特殊情况下, 当n为质数时, \(\varphi(n)=n-1\), 此时, 欧拉定理的表述即为:
\[ a^{n-1} \equiv 1\pmod n \]
这个公式就是费马小定理。
模反元素
如果两个正整数 a 和 n 互质, 那么一定存在一个整数 b 满足:
\[ ab \equiv 1\pmod n \]
即, (ab - 1)能被n整除。 b就叫做a的模反元素。 显然的, 模反元素并不唯一, 对于模反元素b, 对于所有的正整数 $m=b+kn$
也为a的模反元素。
模反元素必然存在
对费马定理进行变形:
\[ a^{\phi\left({n}\right)}\equiv a\times a^{\phi\left(n\right)-1}\equiv 1 \pmod n \]
在此变形中, \(a^{\phi\left(n\right)-1}\) 即为a的模反元素。
RSA 基本概念
我们约定:
- RSA加密秘钥为E, 它是一个大整数。
- RSA解密秘钥为D, 它是一个大整数。
- RSA加密和解密需要用的模数N, 它是一个大整数。
RSA 加密过程
\[ 密文 = 明文^E mod N \]
RSA 加密过程就是这么简单, 它对明文做一个E次幂运算, 然后对N取模。 在这个过程中, E和N的组合就是公钥。
RSA 解密过程
对应的, RSA的解密过程也非常简单:
\[ 明文 = 密文^D mod N \]
RSA 的加密和解密过程完全一致, 只是它们换了一个秘钥, 进行了完全一样的运算。 在这个过程中, D和N的组合就是私钥。
非对称秘钥对的生成
在基本概念中, 约定了几个量, E, D, N 在这里,我么继续沿用, 额外的,在生成密钥对的过程中, 引入一个新的量L, 它只用于生成密钥对, 但是最终结果中我们并不体现它。
1. 求N
准备两个大质数p, q。(p和q要最够大)
\(N=p \times q\)
2. 求L
L是 p-1 和 q-1 的最小公倍数。
\(L=lcm(p-1. q-1)\)
实际上, 理论公式上, L应为ϕ(n), 这样后面的一系列推倒便是欧拉定理的应用了, 但是在实际中,它可以化简为更小的最小公倍数L, 这里,我们使用了实际中的化简方案
3. 求E
E是一个比1大, 比L小的数字,且E和L要互质, 即 E和L的最大公约数为1, 表达为数学语言为。
\[1 < E < L\\ \gcd(E, L) = 1\]
计算E的过程我们采用随机穷举的模式, 使用伪随机数生成器, 随机生成一个1和L之间的数字, 判断是否满足它与L互质, 如果不满足, 则重复生成并判断下一个随机数。
至此, RSA的公钥部分E,N我们已经得到了, 公钥: (E, N)。
我们加入E和L互质的这个条件,是为了满足我们需要的解密参数D一定存在
4. 求D
\(1 < D < L\)
\(E \times D\ mod\ L = 1\)
按照上述的限制条件, 计算出D, 至此, 私钥部分也计算完成, 私钥为(D, N)。
Share
算法-动态规划 Dynamic Programming--从菜鸟到老鸟