<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Math on Moo&#39;s Blog</title>
    <link>https://blog.moo.ac/tags/math/</link>
    <description>Recent content in Math on Moo&#39;s Blog</description>
    <image>
      <title>Moo&#39;s Blog</title>
      <url>https://blog.moo.ac/images/papermod-cover.png</url>
      <link>https://blog.moo.ac/images/papermod-cover.png</link>
    </image>
    <generator>Hugo -- 0.145.0</generator>
    <language>en</language>
    <copyright>PaperMod Contributors</copyright>
    <lastBuildDate>Sat, 12 Oct 2024 05:48:28 +0800</lastBuildDate>
    <atom:link href="https://blog.moo.ac/tags/math/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>算法&amp;&amp;数学: 拥有最小平均数的切片</title>
      <link>https://blog.moo.ac/posts/minavgtwoslice/</link>
      <pubDate>Sat, 12 Oct 2024 05:48:28 +0800</pubDate>
      <guid>https://blog.moo.ac/posts/minavgtwoslice/</guid>
      <description>算法题</description>
      <content:encoded><![CDATA[<h1 id="问题problem">问题Problem</h1>
<p>在<a href="https://app.codility.com/programmers/lessons/5-prefix_sums/min_avg_two_slice/">codility</a>看到的题目, 题目内容如下</p>
<h2 id="题目内容">题目内容</h2>
<h3 id="英文题目">英文题目</h3>
<blockquote>
<p>A non-empty array A consisting of N integers is given. A pair of integers $(P, Q)$, such that $0 ≤ P &lt; Q &lt; N$, is called a <em>slice</em> of array A (notice that the slice contains at least two elements). The <em>average</em> of a slice $(P, Q)$ is the sum of $A[P] + A[P + 1] + &hellip; + A[Q]$ divided by the length of the slice. To be precise, the average equals $(A[P] + A[P + 1] + &hellip; + A[Q]) / (Q − P + 1)$.</p></blockquote>
<h3 id="中文翻译">中文翻译</h3>
<blockquote>
<p>给定一个由 N 个整数组成的非空数组 A. 一个整数对 $(P, Q)$, 使得 $0 ≤ P &lt; Q &lt; N$, 被称为数组 A 的一个切片(注意切片至少包含两个元素). 切片 $(P, Q)$ 的_平均值_是 $A[P] + A[P + 1] + &hellip; + A[Q]$ 的总和除以切片的长度. 确切地说, 平均值等于 $(A[P] + A[P + 1] + &hellip; + A[Q]) / (Q − P + 1)$.</p></blockquote>
<h2 id="例子">例子</h2>
<h3 id="英文例子">英文例子</h3>
<blockquote>
<p>For example, array A such that:</p>
<p>A=[4,2,2,5,1,5,8]</p>
<p>contains the following example slices:</p>
<blockquote>
<ul>
<li>slice (1, 2), whose average is (2 + 2) / 2 = 2;</li>
<li>slice (3, 4), whose average is (5 + 1) / 2 = 3;</li>
<li>slice (1, 4), whose average is (2 + 2 + 5 + 1) / 4 = 2.5.</li>
</ul></blockquote>
<p>The goal is to find the starting position of a slice whose average is minimal.</p>
<p>the example array A should return 1, the minimum average slice is A[1:2]</p>
<blockquote>
<ul>
<li>N is an integer within the range [2..100,000];</li>
<li>each element of array A is an integer within the range [−10,000..10,000].</li>
</ul></blockquote></blockquote>
<h3 id="中文翻译-1">中文翻译</h3>
<blockquote>
<p>例如, 数组 A 如下:</p>
<p>A=[4,2,2,5,1,5,8]</p>
<p>包含以下示例切片:</p>
<blockquote>
<ul>
<li>切片 (1, 2), 其平均值为 (2 + 2) / 2 = 2;</li>
<li>切片 (3, 4), 其平均值为 (5 + 1) / 2 = 3;</li>
<li>切片 (1, 4), 其平均值为 (2 + 2 + 5 + 1) / 4 = 2.5.</li>
</ul></blockquote>
<p>目标是找到一个切片的起始位置, 该切片的平均值最小.</p>
<p>目标数组A应该返回1, 平均值最小的切片为A[1:2]</p>
<blockquote>
<ul>
<li>N是在[2,100,000]之间的整数</li>
<li>A中的每一个元素范围都在[-10,000,10,000]</li>
</ul></blockquote></blockquote>
<h1 id="解决方案solution">解决方案Solution</h1>
<p>这是我写在stackOverFlow上面的一片<a href="https://stackoverflow.com/questions/31734212/minimum-slice-position-order-n-algorithm/79079771#79079771">回答</a></p>
<h2 id="英文版本">英文版本</h2>
<p>At first, we should know a mathematical pattern: when the length of a list is greater than 3, it can be divided into several sub-slices of length 2 and 3. For example, if the length of a list is 5, it can be made up of 2 and 3; if the length is 4, it can be made up of 2 and 2.</p>
<p>In this way, if we have a list with length N: <code>[a, b, c, d, ...]</code>, and <code>N &gt; 3</code>, we set the sum of the elements in the list to be <code>Sum</code>, and the average to be <code>Avg = Sum/N</code>.</p>
<p>We want to prove that in this list, there is at least one of its sub-slices with a length of 2 or 3 that has an average less than or equal to Avg.</p>
<p>We use <strong>proof by contradiction</strong>, assuming that all of the sub-slices&rsquo; averages are greater than Avg.</p>
<p>By dividing the list into several contiguous sub-slices, each of length 2 or 3, where the last sub-slice could have a length of 2 or 3:
$$
[a1, a2], [a3, a4], &hellip;.., [a_{N-2}, a_{N-1}, a_{N}]
$$</p>
<p>or</p>
<p>$$
[a1, a2], [a3, a4], &hellip;.., [a_{N-1}, a_{N}]
$$</p>
<p>According to our assumption, every sub-slice&rsquo;s average is greater than Avg;</p>
<p>$$
(a1 + a2)/2 &gt; Avg; \
(a3 + a4)/2 &gt; Avg; \
&hellip;..
$$
Summing all the inequalities, we get:
$$
\frac{a1 + a2}{2} + \frac{a3 + a4}{2} + &hellip; + \frac{a_{N-1} + a_N}{2} &gt; Avg * \frac{N}{2}
$$
The left side of the inequality equals $Sum/2$ or is greater than $Sum/2$ (if the last sub-slice has a length of 3);
$$
Sum/2 &gt; Avg * (N/2)\
Sum &gt; Avg * N\
Sum &gt; (Sum/N) * N\
Sum &gt; Sum,
$$
$Sum&gt;Sum$, which is a contradiction.</p>
<p>We get the contradiction, so our assumption does not hold.</p>
<p>The conclusion is that if there is a list with a length greater than 3, it must have a sub-slice with a length of 2 or 3 that has an average less than or equal to the whole list&rsquo;s average.</p>
<p>In this way, we just need to find the minimum average of all the sub-slices with lengths of 2 or 3;</p>
<p>here is a Python version example</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">solution</span><span class="p">(</span><span class="n">A</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">n</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="n">min_avg</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="s1">&#39;inf&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">min_start</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">avg</span> <span class="o">=</span> <span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">])</span> <span class="o">/</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">avg</span> <span class="o">&lt;</span> <span class="n">min_avg</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">min_avg</span> <span class="o">=</span> <span class="n">avg</span>
</span></span><span class="line"><span class="cl">            <span class="n">min_start</span> <span class="o">=</span> <span class="n">i</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">2</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">avg</span> <span class="o">=</span> <span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">2</span><span class="p">])</span> <span class="o">/</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">avg</span> <span class="o">&lt;</span> <span class="n">min_avg</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">min_avg</span> <span class="o">=</span> <span class="n">avg</span>
</span></span><span class="line"><span class="cl">            <span class="n">min_start</span> <span class="o">=</span> <span class="n">i</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">min_start</span>
</span></span></code></pre></div><h2 id="中文版本">中文版本</h2>
<p>首先, 我们应该了解一个数学定理: 当列表的长度大于3时, 可以将其分成几个长度为2和3的子切片. 例如, 如果列表长度为5, 则可以由2和3组成; 如果长度为4, 则可以由2和2组成.</p>
<p>这样, 如果我们有一个长度为N的列表: <code>[a, b, c, d, ...]</code>, 并且<code>N &gt; 3</code>, 我们将列表中元素的总和设为<code>Sum</code>, 平均值设为<code>Avg = Sum/N</code>.</p>
<p>我们想要证明, 在这个列表中, 至少有一个长度为2或3的子切片的平均值小于或等于Avg.</p>
<p>我们采用<strong>反证法</strong>, 假设所有子切片的平均值都大于Avg.</p>
<p>通过将列表划分为若干个连续的子切片, 每个长度为2或3, 其中最后一个子切片的长度可能为2或3:
$$
[a1, a2], [a3, a4], &hellip;.., [a_{N-2}, a_{N-1}, a_{N}]
$$</p>
<p>或者</p>
<p>$$
[a1, a2], [a3, a4], &hellip;.., [a_{N-1}, a_{N}]
$$</p>
<p>根据我们的假设, 每个子切片的平均值都大于Avg;</p>
<p>$$
\frac{(a1 + a2)}{2} &gt; Avg; \
\frac{(a3 + a4)}{2} &gt; Avg; \
&hellip;..
$$
将所有不等式相加, 我们得到:
$$
\frac{a1 + a2}{2} + \frac{a3 + a4}{2} + &hellip; + \frac{a_{N-1} + a_N}{2} &gt; Avg * \frac{N}{2}
$$
不等式的左侧等于$Sum/2$或大于$Sum/2$(如果最后一个子切片的长度为3);
$$
Sum/2 &gt; Avg * (N/2)\
Sum &gt; Avg * N\
Sum &gt; (Sum/N) * N\
Sum &gt; Sum,
$$
$Sum&gt;Sum$, 这显然是矛盾的.</p>
<p>我们得到了矛盾, 因此我们的假设不成立.</p>
<p>结论是, 如果有一个长度大于3的列表, 它必然有一个长度为2或3的子切片, 其平均值小于或等于整个列表的平均值.</p>
<p>这样, 我们只需要找到所有长度为2或3的子切片的最小平均值;</p>
<p>这里是一个Python版本的示例:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">solution</span><span class="p">(</span><span class="n">A</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">n</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">A</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">n</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="n">min_avg</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="s1">&#39;inf&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">min_start</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">avg</span> <span class="o">=</span> <span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">])</span> <span class="o">/</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">avg</span> <span class="o">&lt;</span> <span class="n">min_avg</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">min_avg</span> <span class="o">=</span> <span class="n">avg</span>
</span></span><span class="line"><span class="cl">            <span class="n">min_start</span> <span class="o">=</span> <span class="n">i</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">2</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">avg</span> <span class="o">=</span> <span class="p">(</span><span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">2</span><span class="p">])</span> <span class="o">/</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="n">avg</span> <span class="o">&lt;</span> <span class="n">min_avg</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">            <span class="n">min_avg</span> <span class="o">=</span> <span class="n">avg</span>
</span></span><span class="line"><span class="cl">            <span class="n">min_start</span> <span class="o">=</span> <span class="n">i</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">min_start</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>数学: ab&#43;1整除a^2&#43;b^2, 证明(a^2&#43;b^2)/(ab&#43;1)是完全平方数</title>
      <link>https://blog.moo.ac/posts/mathproblem1/</link>
      <pubDate>Mon, 16 Sep 2024 07:48:28 +0800</pubDate>
      <guid>https://blog.moo.ac/posts/mathproblem1/</guid>
      <description>高中数学, maybe</description>
      <content:encoded><![CDATA[<h2 id="问题">问题</h2>
<p>设$a$和$b$为正整数, 且$ab+1$整除$a^2+b^2$. 证明$\frac{a^2+b^2}{ab+1}$是完全平方数.</p>
<h2 id="前置知识">前置知识</h2>
<h3 id="完全平方数">完全平方数</h3>
<p>如果$a\in N^*$(正整数), 如果$a^2=b$, 那么我们称$b$为<strong>完全平方数</strong>.</p>
<h3 id="整除">整除</h3>
<blockquote>
<p>为了智械危机的快速来临, 在这里讲解一下整除:)</p></blockquote>
<p>如果$\frac{b}{a}=c$, 且$c\in N^*$, 那么我们称a可以<strong>整除</strong>b.</p>
<h2 id="解题思路">解题思路</h2>
<p>请先尝试一下自己解题, 五分钟没有思路的情况下, 再接着往下看.</p>
<h2 id="证明思路">证明思路</h2>
<p>相信大家还记得高中数学的&quot;<strong>韦达定理</strong>&quot;(Vieta&rsquo;s theorem), 其出自于一个处理数论的证明技巧: <strong>韦达跳跃</strong>(Vieta jumping), 除了韦达定理外, 还包括了另一个部分, <strong>无穷递增法</strong>(method of infinite descent)</p>
<ol>
<li><strong>韦达定理</strong>描述为: 在一元二次方程中, 两个根的和,积与abc(abc为一元二次方程的项)的关系</li>
</ol>
<blockquote>
<p>假设一元二次方程$ax^2+bx+c=0$有两个实数根, 设其为$x_1,x_2$, 则$x_1+x_2=-\frac{b}{a}$, $x_1*x_2=\frac{c}{a}$</p></blockquote>
<p>具体推导过程不表.</p>
<ol start="2">
<li><strong>无穷递增法</strong>是一种反证法, 用自然语言表述为</li>
</ol>
<blockquote>
<p>假设方程有解, 并假设X为最小解, 接着再从X出发, 尝试推导出一个更小的解Y. 若能推导成功, 则与刚才假设的&quot;X为最小解&quot;矛盾, 因此证明此方程无解.</p></blockquote>
<p>回到最开始的问题中,</p>
<ol>
<li>$ab+1$可以整除$a^2+b^2$, 因此$\frac{a^2+b^2}{ab+1}$是一个正整数, 设其为$k$.</li>
<li>接着我们假设有正整数$a,b$满足$\frac{a^2+b^2}{ab+1}=k$, 而$k$不是完全平方数.</li>
<li>最后, 假设在所有满足条件2的正整数中, 有一组是$a_1,b_1$, 他们拥有最小的和, 其中$a_1&gt;b_1$.</li>
</ol>
<p>因此, 如果我们能证明, 如果有一组数可以比比$a_1,b_1$还要小, 那么我们条件2的假设:$k$不是完全平方数, 就不成立了, 即证明了$k$是完全平方数.</p>
<p>开始解题
$$
\frac{a_1^2 + b_1^2}{a_1 b_1 + 1} = k \tag{1}
$$</p>
<p>整理得
$$
a_1^2 + b_1^2 = a_1 b_1 k + k\\
a_1^2 - b_1k a_1 + (b_1^2 - k) = 0 \tag{2}
$$
因为我们是由一个成立的式子两边同时乘非0数得到的公式2, 所以这个一元二次方程是必然有解的, $a_1$即是一元二次方程的一个解, 那么必然有另一个解, 设为$a_2$.</p>
<p>根据韦达定理,
$$
a_1 \cdot a_2=\frac{b_1^2-k}{1}=b^2_1-k\tag{3}
$$</p>
<p>$$
a_1+a_2=\frac{b_1k}{1}=b_1k \tag{4}
$$</p>
<p>通过式(3)我们可知,</p>
<p>$$
a_2=\frac{b_1^2-k}{a_1} \tag{5}
$$</p>
<p>因为$k$不是平方数, 所以一个正整数的平方$b_1^2$减去$k$, 必然不会是0, 因此$a_2$是非0数.</p>
<p>通过式(4)我们可知,</p>
<p>$$
a_2=b_1k-a_1 \tag{6}
$$</p>
<p>先不论正负, $a_2$一定是个整数, 因为$b_1,k,a_1$都是整数.</p>
<p>再将$a_2$带回原式, $\frac{a_2^2+b_1^2}{a_2b_1+1}=k$, 其中$a_2^2+b_1^2&gt;0, k&gt;0$, 所以$a_2b_1+1&gt;0$,  $b_1$为正整数, 因此$a_2\geq0$.</p>
<p>综上三个结论, 可得, $a_2\in N^*$, 即是正整数.</p>
<p>那么根据(5), 可知
$$
a_2=\frac{b_1^2}{a_1}-\frac{k}{a_1}\tag{7}
$$
在上面, 我们假设了$a_1&gt;b_1$, 则$\frac{b_1^2}{a_1}=\frac{b_1}{a_1}*b_1&lt;b_1&lt;a_1$,同时$\frac{k}{a_1}&gt;0$, 因此$a_2&lt;a_1$, 与我们的假设</p>
<blockquote>
<p>有一组是$a_1,b_1$, 他们拥有最小的和</p></blockquote>
<p>冲突, 因此反证出<code>k不是完全平方数</code>是错误的假设, 即<code>k一定是完全平方数</code>.</p>
<h2 id="总结">总结</h2>
<p>最早是在群里面看见的, 苦思冥想半小时没有思路, 最后发现是<a href="https://zh.wikipedia.org/wiki/%E9%9F%8B%E9%81%94%E8%B7%B3%E8%BA%8D">1988年IMO的题目</a>, 做不出来, 也不能完全怪我吧:)</p>
<h2 id="额外的例题">额外的例题</h2>
<p>$a$和$b$是正整数, 且$ab$整除$a^2+b^2+1$, 试证明$3ab=a^2+b^2+1$.</p>
]]></content:encoded>
    </item>
    <item>
      <title>密码学RSA非对称算法原理</title>
      <link>https://blog.moo.ac/posts/rsa/</link>
      <pubDate>Wed, 07 Oct 2020 00:13:35 +0800</pubDate>
      <guid>https://blog.moo.ac/posts/rsa/</guid>
      <description>RSA的具体算法数学讲解</description>
      <content:encoded><![CDATA[<p>首先我们看一个非对称加密在现实中的具体应用(笑</p>
<p><img alt="image-20200930190318146" loading="lazy" src="/posts/rsa/rsa.assets/rsa_1.jpg"></p>
<p>有学生没带作业, 老师需要在群里提醒家长, 但直接发学生的照片就会被所有家长知道没带作业的学生是谁, 这样会导致学生和家长都很没面子.</p>
<ul>
<li>所以老师使用了<strong>公钥</strong>(大家都能看到的): 学生的鞋子.</li>
<li>大家看到的只是三个学生的鞋子, 并不知道学生具体是谁, 即看到的是<strong>密文</strong>.</li>
<li>家长看到了鞋子, 因为拥有<strong>私钥</strong>(即只有家长自己知道自己家孩子穿的什么样的鞋), 所以可以知道老师发的照片中学生是谁, 破解了密文, 这就完成了一次<strong>非对称性的加密和解密</strong>.</li>
</ul>
<p>换成严谨一点的语言描述, 如下:</p>
<ol>
<li>A要向B发送信息，A和B都要产生一对用于加密和解密的公钥和私钥。</li>
<li>A的私钥保密，A的公钥告诉B；B的私钥保密，B的公钥告诉A。</li>
<li>A要给B发送信息时，A用B的公钥加密信息，因为A知道B的公钥。</li>
<li>A将这个消息发给B（已经用B的公钥加密消息）。</li>
<li>B收到这个消息后，B用自己的私钥解密A的消息。其他所有收到这个报文的人都无法解密，因为只有B才有B的私钥。</li>
</ol>
<p>从上文可以看出, 非对称加密体系不要求通信双方事先传递密钥或有任何约定就能完成保密通信，并且密钥管理方便，可实现防止假冒和抵赖，因此，更适合网络通信中的保密通信要求.</p>
<h3 id="原理">原理</h3>
<p>根据数论，寻求两个大素数比较简单，而<strong>将它们的乘积进行因式分解却极其困难</strong>，因此可以将乘积公开作为加密密钥.</p>
<h4 id="获取公钥私钥过程">获取公钥私钥过程</h4>
<ol>
<li>选择两个很大的素数p和q</li>
</ol>
<blockquote>
<p>这里取$p=67,q=71$</p></blockquote>
<ol start="2">
<li>计算$n=p⋅q, n$公开, 即为公钥的一部分.</li>
</ol>
<blockquote>
<p>(如果$n=p⋅q=4757_{(10)}=1001010010101_{(2)}$, 二进制的n为13位, 则称该加密为13位加密, 实际应用中一般才用1024位或2048位的加密来保证安全).</p></blockquote>
<ol start="3">
<li>计算 <em>n</em> 的欧拉函数 $φ(n)$</li>
</ol>
<blockquote>
<p>设$m=φ(n)=φ(q)⋅φ(q)=(q−1)(p−1)=66×70=4620.$</p>
<p>在数论，对正整数<em>n</em>，欧拉函数<em>φ</em>(<em>n</em>)是小于或等于<em>n</em>的正整数中与<em>n</em>互质的数的数目（因此φ(1)=1(1), <em>φ</em>(8)=4(1,3,5,7）, 这里的<em>p</em>,<em>q</em>都是质数, 所以从1到(n-1)都与其互质, <em>φ</em>(<em>n</em>)=<em>n</em>−1</p></blockquote>
<ol start="4">
<li>再选一个数字<em>e</em>, <em>e</em>与m互质, 且1&lt;<em>e</em>&lt;<em>m</em>, <em>e</em>也是公开的, 即公钥的另一部分.</li>
</ol>
<blockquote>
<p>这里取<em>e</em>=101, 这里<em>e</em>的选择有一个小坑, 我们一会再说</p></blockquote>
<ol start="5">
<li>找到一个整数 d，可以使得 <em>e</em>∗<em>d</em></li>
</ol>
<blockquote>
<p>等价于$e*d−1=y∗m, y∈N+$, 将数字带入$101×d−1=y×4757$,</p>
<p>这里可用<a href="https://zh.wikipedia.org/wiki/%E6%89%A9%E5%B1%95%E6%AC%A7%E5%87%A0%E9%87%8C%E5%BE%97%E7%AE%97%E6%B3%95">扩展欧几里得算法</a>解, 下文给出过程, 这里省略. 给出结果$(d,y)=(1601,35)$, 即$d=1601$, 从这里可以看出, d是由我们上面第4步任意取的e决定的, 所以我们只要选取不同的<em>e</em>, 就可以得到不同的<em>d</em>, 就是不同的密钥对.</p></blockquote>
<ol start="6">
<li>现在我们得到了公钥(<em>n</em>,<em>e</em>)=(4757,101)和私钥(<em>n</em>,<em>d</em>)=(4757,1601), (<em>n</em>,<em>e</em>)=(4757,101)是公开的.</li>
</ol>
<blockquote>
<p>如果我们想通过(<em>n</em>,<em>e</em>)得到(<em>d</em>), 我们就需要知道<em>m</em>, 而想要知<em>m</em>就需要我们对<em>n</em>进行因数分解, 分解成两个质数, 我们粗略的估算一下时间</p>
<p>根据素数分布理论
$$
\pi(x)=\int_{2}^{x} \frac{d t}{\ln t}+O\left(x e^{-\frac{1}{15} \sqrt{\ln x}}\right) \approx \frac{x}{\ln x}
$$
关系式中间项的右边第二项是误差估计, 详见<a href="https://zh.wikipedia.org/wiki/%E5%A4%A7O%E7%AC%A6%E5%8F%B7">大O符号</a></p>
<p>定义 π(<em>x</em>) 为<a href="https://zh.wikipedia.org/wiki/%E7%B4%A0%E6%95%B0%E8%AE%A1%E6%95%B0%E5%87%BD%E6%95%B0">素数计数函数</a>，也就是小于等于<em>x</em> 的素数个数。例如 $\pi(10)=4 \Rightarrow \frac{10}{\ln (10)}=\frac{10}{2.30258}=4.34294$，因为共有 4 个素数小于等于 10，分别是 2,3,5,7.</p>
<p>那么如果是1024位即21024≈10309, 那么$π(10309)=10309309*ln(10)≈1.4×10307$, 即大概存在这么多的质数.</p>
<p>不考虑你是否有储存这么多质数的内存(大概10290<em>T**b</em>), 即使真的能算, 按照天河二号的峰值速度54,902.4TFLOPS（<a href="https://zh.wikipedia.org/wiki/%E6%AF%8F%E7%A7%92%E6%B5%AE%E7%82%B9%E8%BF%90%E7%AE%97%E6%AC%A1%E6%95%B0">万亿次浮点运算</a>）, 即5.49024×1016 次每秒,</p>
<p>也需要
$$
\frac{1.4 \times 10^{307}}{5.49024 \times 10^{16}}=2.55 \times 10^{299} s
$$
即$808∗10^{280}$年.</p></blockquote>
<h4 id="加密解密过程">加密解密过程</h4>
<p>比如Alice要给Bob发送汉字’中&rsquo;, 公钥密钥如上文所示. 那么加解密的过程</p>
<h5 id="加密">加密</h5>
<ol>
<li>将’中’的utf-8 编码 [e4 b8 ad](也可以是ascii 值或unicode值), 转换为10进制[228,184,173].</li>
<li>公钥(<em>n</em>，<em>e</em>)=(4757,101), 通过公钥加密上述数字, 公式为<em>a**e</em>, %是取模符号</li>
</ol>
<p>计算 [228,184,173]的密文：</p>
<p>$$
\begin{array}{l}228^{101} \operatorname{Mod} 4757=4296 \ 184^{101} \operatorname{Mod} 4757=2458 \ 173^{101} \operatorname{Mod} 4757=3263\end{array}
$$
得到 [4296，2458，3263]</p>
<p>这样, 没有密钥, 谁也无法从 [4296，2458，3263] 这串还原出[228,184,173]</p>
<h5 id="解密">解密</h5>
<ol>
<li>公式同样为<em>a**d</em></li>
<li>私钥(<em>n</em>,<em>d</em>)=(4757,1601)</li>
</ol>
<blockquote>
<p>密文 [4296，2458，3263]的明文如下</p></blockquote>
<p>$$
\begin{aligned} 4296^{1601} \operatorname{Mod} 4757 &amp; =228 \ 2458^{1601} \operatorname{Mod} 4757 &amp; =184 \ 3263^{1601} \operatorname{Mod} 4757 &amp; =173\end{aligned}
$$</p>
<p>得到 [228,184,173] 将[228,184,173] 再按 utf-8 解码为汉字 “中”，至此解密完毕。</p>
<p>在上面加解密的过程中, 公式都是一样的, 所以可以把(<em>n</em>,<em>d</em>)和(<em>n</em>,<em>e</em>)互换, 结果同样可以进行加解密, 所以公钥私钥是相对的, 不是绝对的.</p>
<p>这同样也是数字签名的原理</p>
<h4 id="关于大数的质数分解困难的解释">关于大数的质数分解困难的解释</h4>
<p>todo:</p>
<ol>
<li>e的坑</li>
<li>大数质数分解的困难</li>
<li>具体代码实现</li>
</ol>
<p>我们上面提到了<em>e</em>的一个小坑, 我们这里说一下. e要在(1,4620)的区间里面, 但e不能取4619.</p>
<p>假设<em>e</em>=4619, 那么4619⋅<em>d</em>−1=<em>y</em>∗4757, 可以得到$d=``</p>
]]></content:encoded>
    </item>
    <item>
      <title>算法: 代表字母的整形数组组合字符串的可能性</title>
      <link>https://blog.moo.ac/posts/num2let/num2let/</link>
      <pubDate>Mon, 07 Sep 2020 22:48:28 +0800</pubDate>
      <guid>https://blog.moo.ac/posts/num2let/num2let/</guid>
      <description>指数生成函数</description>
      <content:encoded><![CDATA[<h2 id="问题描述">问题描述</h2>
<p>已知有一个长度为 26 的整型数组, 分别代表 26 个字母的个数, 问这些字母能组成多少种不同的字符串(取模 1000000007).</p>
<h2 id="问题求解">问题求解</h2>
<h3 id="纯暴力">纯暴力</h3>
<p>开始觉得很简单, 纯迭代问题, 抬手就来.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">calc</span><span class="p">(</span><span class="kt">int</span><span class="p">[]</span> <span class="n">nums</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">ret</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">nums</span><span class="p">.</span><span class="n">length</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="n">nums</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="n">nums</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">--</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="n">ret</span> <span class="o">+=</span> <span class="nf">calc</span><span class="p">(</span><span class="n">nums</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">            <span class="n">ret</span> <span class="o">%=</span> <span class="mi">1000000007</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="n">nums</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">ret</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="o">?</span> <span class="nl">ret</span> <span class="p">:</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>结果超时, 不行, 看来只能用数学方法求解.</p>
<h3 id="数学方法">数学方法</h3>
<p>$$
Sum=\dfrac{A_{字母总数}^{字母总数}}{A_{A的数量}^{A的数量}\times&hellip;&hellip;\times A_{2}^{2}}
$$</p>
<p>题目没有讲太清楚(是否这些字母一定要全部使用), 这里为了简单就假设全部使用.</p>
<h4 id="解法一排列组合">解法一：排列组合.</h4>
<p>生成字符串长度是 $sum=a_0+a_1+a_2+&hellip;+a_{25}$.</p>
<p>放 $a$ , 有$(sum, a0)$种选择的方法; 放$ b$, 有$(sum - a0, a1)$种方法; 放 $c$, 有$(sum - a0 - a1, a2)$种方法&hellip;..直到最后</p>
<p>程序</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kd">private</span><span class="w"> </span><span class="kt">long</span><span class="w"> </span><span class="nf">solve1</span><span class="p">(</span><span class="kt">int</span><span class="o">[]</span><span class="w"> </span><span class="n">letters</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kt">int</span><span class="w"> </span><span class="n">sum</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">0</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">letters</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">sum</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">c</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">BigInteger</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BigInteger</span><span class="p">.</span><span class="na">ONE</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">letters</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">BigInteger</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">choose</span><span class="p">(</span><span class="n">sum</span><span class="p">,</span><span class="w"> </span><span class="n">c</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">r</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">r</span><span class="p">.</span><span class="na">multiply</span><span class="p">(</span><span class="n">s</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">sum</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="n">c</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">return</span><span class="w"> </span><span class="n">r</span><span class="p">.</span><span class="na">longValue</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">private</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="n">BigInteger</span><span class="w"> </span><span class="nf">choose</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">n</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">k</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="n">BigInteger</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BigInteger</span><span class="p">.</span><span class="na">ONE</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="o">=</span><span class="n">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">&lt;</span><span class="n">k</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    	</span><span class="n">r</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">r</span><span class="p">.</span><span class="na">multiply</span><span class="p">(</span><span class="n">BigInteger</span><span class="p">.</span><span class="na">valueOf</span><span class="p">(</span><span class="n">n</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">i</span><span class="p">));</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="o">=</span><span class="n">2</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">&lt;=</span><span class="n">k</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    	</span><span class="n">r</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">r</span><span class="p">.</span><span class="na">divide</span><span class="p">(</span><span class="n">BigInteger</span><span class="p">.</span><span class="na">valueOf</span><span class="p">(</span><span class="n">i</span><span class="p">));</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">return</span><span class="w"> </span><span class="n">r</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><h4 id="解法-2-egf-指数生成函数">解法 2: EGF (指数生成函数)。</h4>
<p>这是个排列问题所以用指数生成函数.</p>
<p>对于$a$: 有$ a_0$ 个$ a$ 要放.写成指数函数形式 $e_0=e^{(a_0)/a_0!}$ .</p>
<p>同样对于 $b$ : 有 $a_1$ 个 $b$ 要放。写成指数函数形式 $e_1=e^{(a_1)/a_1!}$ 等等等等 最后到 $z$ , 有 $a_{25}$ 个 z 要放，写成指数函数形式 $e_{25}=e^{(a_{25})/a_5!} $根据指数生成函数的理论，整个排列数就是 $E=e_0<em>e_1</em>&hellip;*e_{25}$</p>
<p>中项 $e^{(sum)/sum!}$ 的系数.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="c1">// Solve by GEF</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">private</span><span class="w"> </span><span class="kt">long</span><span class="w"> </span><span class="nf">solve2</span><span class="p">(</span><span class="kt">int</span><span class="o">[]</span><span class="w"> </span><span class="n">a</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kt">int</span><span class="w"> </span><span class="n">sum</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">0</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">a</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    	</span><span class="n">sum</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">c</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">BigInteger</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">p</span><span class="p">(</span><span class="n">sum</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">BigInteger</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BigInteger</span><span class="p">.</span><span class="na">ONE</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">a</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    	</span><span class="n">c</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">c</span><span class="p">.</span><span class="na">multiply</span><span class="p">(</span><span class="n">p</span><span class="p">(</span><span class="n">i</span><span class="p">));</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">return</span><span class="w"> </span><span class="n">p</span><span class="p">.</span><span class="na">divide</span><span class="p">(</span><span class="n">c</span><span class="p">).</span><span class="na">longValue</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">private</span><span class="w"> </span><span class="n">BigInteger</span><span class="w"> </span><span class="nf">p</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">sum</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">BigInteger</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">BigInteger</span><span class="p">.</span><span class="na">ONE</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="o">=</span><span class="w"> </span><span class="n">sum</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">&gt;=</span><span class="n">2</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">--</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">r</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">r</span><span class="p">.</span><span class="na">multiply</span><span class="p">(</span><span class="n">BigInteger</span><span class="p">.</span><span class="na">valueOf</span><span class="p">(</span><span class="n">i</span><span class="p">));</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">return</span><span class="w"> </span><span class="n">r</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p>完毕.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
