<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>数学・密码・量子 on kenji.blog</title><link>http://kenji.blog/zh-cn/categories/%E6%95%B0%E5%AD%A6%E5%AF%86%E7%A0%81%E9%87%8F%E5%AD%90/</link><description>Recent content in 数学・密码・量子 on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 05 Sep 2026 22:09:22 +0900</lastBuildDate><atom:link href="http://kenji.blog/zh-cn/categories/%E6%95%B0%E5%AD%A6%E5%AF%86%E7%A0%81%E9%87%8F%E5%AD%90/index.xml" rel="self" type="application/rss+xml"/><item><title>【PQC】量子计算时代的新一代密码学：后量子密码学全景</title><link>http://kenji.blog/zh-cn/p/post-quantum-cryptography/</link><pubDate>Sat, 05 Sep 2026 22:09:22 +0900</pubDate><guid>http://kenji.blog/zh-cn/p/post-quantum-cryptography/</guid><description>&lt;img src="http://kenji.blog/p/post-quantum-cryptography/post_quantum_cryptography_1788613735417.jpg" alt="Featured image of post 【PQC】量子计算时代的新一代密码学：后量子密码学全景" />&lt;h2 id="引言量子计算机带来的密码技术威胁">引言：量子计算机带来的密码技术“威胁”
&lt;/h2>&lt;p>目前，我们在互联网上日常进行的通信——在线银行的支付、网站的浏览（HTTPS）、消息应用程序中的交流，乃至区块链和加密资产的交易——其中很大一部分都受到被称为“公钥密码学”的技术的保护。具体而言，RSA加密和椭圆曲线加密（ECC）等算法，构成了支撑现代数字社会可靠性的根基。&lt;/p>
&lt;p>这些密码方式的安全性依据是“大数分解”和“离散对数问题”等数学难题，使用当前的经典计算机（包括超级计算机）去破解需要耗费天文数字般的时间。然而，随着近年来取得显著进展的 &lt;strong>“量子计算机”&lt;/strong> 投入实际应用，这一前提将被彻底推翻。&lt;/p>
&lt;p>1994年彼得·肖尔（Peter Shor）发表的“肖尔算法”在数学上证明了，如果使用具备足够性能的量子计算机，就能在极短的时间内解决大数分解和离散对数问题。这意味着，目前保护互联网的加密通信在未来都面临着被破解的风险（这被称为 Y2Q：Years to Quantum，或 Q-Day 问题）。&lt;/p>
&lt;p>更加严重的是存在一种被称为“Harvest Now, Decrypt Later（先窃取存储，待未来能破解时再解密）”的攻击手法。对于国家机密、企业知识产权、个人生物特征信息等需要保密几十年的数据，现在可能已经成为为了未来解密而被窃取的目标。&lt;/p>
&lt;p>为了应对这一前所未有的危机，全世界的密码学家和研究机构正全力以赴开发即使面对量子计算机的攻击也能保持安全的新一代密码技术—— &lt;strong>后量子密码学（PQC：Post-Quantum Cryptography）&lt;/strong>。本文将详细介绍PQC的基础、主要算法的机制，以及美国国家标准与技术研究院（NIST）推进的全球标准化最新动向。&lt;/p>
&lt;hr>
&lt;h2 id="什么是后量子密码学pqc">什么是后量子密码学（PQC）？
&lt;/h2>&lt;p>后量子密码学（Post-Quantum Cryptography, PQC）是指设计为既能在现有的经典计算机上运行，又能够抵御未来出现的大规模量子计算机攻击（如肖尔算法等）的一类密码算法的总称。&lt;/p>
&lt;p>常被混淆的技术有“量子密码学（Quantum Cryptography）”和“量子密钥分发（QKD）”，但它们是完全不同的路径。量子密码学（QKD）是利用量子力学的物理法则（如观测会改变状态的特性等），在物理层面上使通信路径上的窃听变得不可能的硬件基础技术。它需要专用的光纤和特殊设备，面临着导入成本和距离限制等挑战。&lt;/p>
&lt;p>另一方面，&lt;strong>PQC说到底是基于“数学”的软件基础密码技术&lt;/strong>。因此，它作为软件更新集成到现有的互联网基础设施、服务器、智能手机和浏览器中是可行的，具有极高的现实社会适用性。全世界的IT企业和政府机构当前的当务之急是将目前使用的RSA或ECC替换（迁移）为这种PQC。&lt;/p>
&lt;hr>
&lt;h2 id="支撑pqc的4个主要数学路径">支撑PQC的4个主要数学路径
&lt;/h2>&lt;p>基于即使使用量子计算机也无法高效求解的数学难题（如NP困难问题等），人们提出了各种PQC算法。这里介绍目前成为主流的4个主要类别。&lt;/p>
&lt;h3 id="后量子密码学pqc的主要路径">后量子密码学（PQC）的主要路径
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-gdscript3" data-lang="gdscript3">&lt;span class="line">&lt;span class="cl">&lt;span class="n">graph&lt;/span> &lt;span class="n">LR&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PQC&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="err">后量子密码学&lt;/span> &lt;span class="n">PQC&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">--&amp;gt;&lt;/span> &lt;span class="n">L&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="err">基于格的密码&lt;/span> &lt;span class="n">Lattice&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">based&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PQC&lt;/span> &lt;span class="o">--&amp;gt;&lt;/span> &lt;span class="n">H&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="err">基于哈希的密码&lt;/span> &lt;span class="n">Hash&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">based&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PQC&lt;/span> &lt;span class="o">--&amp;gt;&lt;/span> &lt;span class="n">M&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="err">多变量多项式密码&lt;/span> &lt;span class="n">Multivariate&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PQC&lt;/span> &lt;span class="o">--&amp;gt;&lt;/span> &lt;span class="n">C&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="err">基于编码的密码&lt;/span> &lt;span class="n">Code&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">based&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">L&lt;/span> &lt;span class="o">--&amp;gt;&lt;/span> &lt;span class="n">L1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">FIPS&lt;/span> &lt;span class="mi">203&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">ML&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">KEM&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">L&lt;/span> &lt;span class="o">--&amp;gt;&lt;/span> &lt;span class="n">L2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">FIPS&lt;/span> &lt;span class="mi">204&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">ML&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">DSA&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">H&lt;/span> &lt;span class="o">--&amp;gt;&lt;/span> &lt;span class="n">H1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">FIPS&lt;/span> &lt;span class="mi">205&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">SLH&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">DSA&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">style&lt;/span> &lt;span class="n">PQC&lt;/span> &lt;span class="n">fill&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="c1">#f9f,stroke:#333,stroke-width:2px&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="1-基于格的密码lattice-based-cryptography">1. 基于格的密码（Lattice-based Cryptography）
&lt;/h3>&lt;p>目前，在PQC领域最被看好且成为主流的是这种“基于格的密码”。格密码的安全性基于多维空间中规则排列的点（格点）相关的问题。著名的问题包括“最短向量问题（SVP：Shortest Vector Problem）”和“LWE问题（Learning With Errors）”等。&lt;/p>
&lt;p>&lt;strong>机制概要：&lt;/strong>
想象在一个维度极高（数百至数千维）的空间中，无数的点呈网格状排列。要在2维或3维中找到某个特定的格点很容易，但在数百维中，目前尚未发现能用经典计算机或量子计算机高效找出的算法。特别是LWE问题利用了这样一个特性：“如果在联立一次方程中故意加入微小的‘噪声（误差）’，推测原始变量就会变得极度困难”。&lt;/p>
&lt;p>&lt;strong>优点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>适用于密钥封装机制（KEM）和数字签名。&lt;/li>
&lt;li>处理速度极快（有时甚至比RSA和ECC还要快）。&lt;/li>
&lt;li>密钥尺寸和密文尺寸相对较小，平衡性好。&lt;/li>
&lt;/ul>
&lt;p>目前NIST正在标准化的算法中，很多（如ML-KEM和ML-DSA）都采用了这种基于格的密码。&lt;/p>
&lt;h3 id="2-基于哈希的密码hash-based-cryptography">2. 基于哈希的密码（Hash-based Cryptography）
&lt;/h3>&lt;p>基于哈希的密码是专注于数字签名的PQC算法。其安全性的基础仅仅依赖于安全的“密码学哈希函数”（如SHA-2或SHA-3）所具备的抗碰撞性和单向性。&lt;/p>
&lt;p>&lt;strong>机制概要：&lt;/strong>
以只能使用一次的所谓“兰波特签名（Lamport Signature）”（一次性签名）为出发点，通过使用被称为“默克尔树（Merkle Tree）”的树状数据结构将其捆绑，从而使得一个密钥对能够进行多次签名。&lt;/p>
&lt;p>&lt;strong>优点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>安全基础极其坚固，有着“只要哈希函数安全则密码安全”的强力证明。&lt;/li>
&lt;li>对数学结构的依赖少，发现未预料到的破解方法的风险低。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>缺点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>无法用于密钥封装机制（KEM），只能用于数字签名。&lt;/li>
&lt;li>签名尺寸往往较大。&lt;/li>
&lt;li>分为“有状态”和“无状态”，有状态（如XMSS）由于需要严格管理密钥的使用次数，在实现上难度较高。&lt;/li>
&lt;/ul>
&lt;p>NIST已将“SLH-DSA（旧称 SPHINCS+）”作为无状态哈希签名进行了标准化。&lt;/p>
&lt;h3 id="3-多变量多项式密码multivariate-cryptography">3. 多变量多项式密码（Multivariate Cryptography）
&lt;/h3>&lt;p>多变量多项式密码的安全性依据是求解具有众多变量的非线性方程组系统（MQ问题：Multivariate Quadratic problem）的困难程度。已知该问题是NP困难的。&lt;/p>
&lt;p>&lt;strong>机制概要：&lt;/strong>
发送方将明文（或哈希值）代入作为公钥传递过来的具有众多变量的复杂方程中，从而生成密文（签名）。合法的接收方拥有将“方程结构转换为易于求解的形式的隐藏信息（陷门）”作为私钥，利用它来进行解密（或签名验证）。&lt;/p>
&lt;p>&lt;strong>优点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>签名尺寸非常小。&lt;/li>
&lt;li>签名验证速度极快。适合于资源受限的物联网设备等。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>缺点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>公钥尺寸非常大（有时可达数十至数百千字节）。&lt;/li>
&lt;li>过去曾出现过有力的算法（如Rainbow）被经典攻击攻破的案例，因此与其他方式相比，建立对其安全性的信任较为困难。&lt;/li>
&lt;/ul>
&lt;h3 id="4-基于编码的密码code-based-cryptography">4. 基于编码的密码（Code-based Cryptography）
&lt;/h3>&lt;p>基于编码的密码是将用于纠正通信路径上错误的“纠错码”理论应用到密码学中。1978年提出的“McEliece密码”最为著名，也是PQC中历史最悠久的算法之一。&lt;/p>
&lt;p>&lt;strong>机制概要：&lt;/strong>
发送方利用接收方的公钥（隐藏了特定结构的纠错码的生成矩阵）对明文进行编码，并故意加入错误（噪声）后发送。接收方使用私钥去除错误，提取出明文。破译者必须从不知其结构的普通随机编码中纠正错误，这被称为“一般伴随式解码问题（Syndrome Decoding Problem）”，并被证明是NP困难的。&lt;/p>
&lt;p>&lt;strong>优点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>经过40多年以上的透彻研究，至今未发现有效的攻击，安全信任度极高。&lt;/li>
&lt;li>加解密处理速度快。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>缺点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>公钥尺寸极其巨大（有时可达几兆字节）。因此，在通信带宽和内存受限的环境（如TLS握手等）中难以利用。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="nist推进pqc标准化的最新动向">NIST推进PQC标准化的最新动向
&lt;/h2>&lt;p>美国国家标准与技术研究院（NIST）自2016年起开始向全球公开征集新一代后量子密码算法，并经历了多年的严格评估和多轮筛选。&lt;/p>
&lt;p>2024年，NIST终于作为正式的联邦信息处理标准（FIPS）发布了以下三种算法。这为全球各组织在生产环境中开始实施奠定了坚实的基础。&lt;/p>
&lt;h3 id="已制定的fips标准2024年">已制定的FIPS标准（2024年）
&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>FIPS 203: ML-KEM（旧称: CRYSTALS-Kyber）&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>用途:&lt;/strong> 密钥封装机制（KEM）／加密与密钥共享&lt;/li>
&lt;li>&lt;strong>基础技术:&lt;/strong> 基于格的密码（Module-LWE）&lt;/li>
&lt;li>&lt;strong>特点:&lt;/strong> 密钥尺寸和速度的平衡极佳，将作为Web通信（TLS）和安全消息应用程序等一般互联网用途中的默认PQC密钥共享机制。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>FIPS 204: ML-DSA（旧称: CRYSTALS-Dilithium）&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>用途:&lt;/strong> 数字签名&lt;/li>
&lt;li>&lt;strong>基础技术:&lt;/strong> 基于格的密码（Module-LWE）&lt;/li>
&lt;li>&lt;strong>特点:&lt;/strong> 数字签名的主要标准。能够高效处理，将成为软件签名和文档认证等各种电子签名用途的新标准。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>FIPS 205: SLH-DSA（旧称: SPHINCS+）&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>用途:&lt;/strong> 数字签名&lt;/li>
&lt;li>&lt;strong>基础技术:&lt;/strong> 基于哈希的密码（无状态）&lt;/li>
&lt;li>&lt;strong>特点:&lt;/strong> 万一未来基于格的密码被发现存在漏洞，它将作为备用选项发挥极其重要的作用。虽然签名尺寸较大，但适用于需要长期可靠性的用途。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h3 id="追求进一步的多样性">追求进一步的多样性
&lt;/h3>&lt;p>尽管NIST完成了最初的标准化进程，但仍在继续探索更多的算法。尤其是由于标准过于偏向“基于格的密码”，因此确保 &lt;strong>算法的多样性（Crypto Diversity）&lt;/strong> 被认为非常重要。作为密钥共享的备用标准，基于编码的密码等算法的评估正在推进中，预计未来PQC的基础将变得更加牢固。&lt;/p>
&lt;hr>
&lt;h2 id="向pqc迁移的场景与挑战密码敏捷性的重要性">向PQC迁移的场景与挑战：“密码敏捷性”的重要性
&lt;/h2>&lt;p>随着NIST正式标准规范的发布，全球各地的政府机构、金融机构和科技公司将全面加速从现有的RSA/ECC向PQC的迁移（Migration）。美国国家安全局（NSA）等机构的指南也建议尽早完成迁移。&lt;/p>
&lt;h3 id="采用混合方法">采用混合方法
&lt;/h3>&lt;p>因为PQC算法较新，与经典密码相比尚未经过“时间的考验”。考虑到实现中潜藏的缺陷或发现新攻击方法的风险，在过渡期建议采用 &lt;strong>“混合方式”&lt;/strong>。这是一种将现有且经过验证的密码（例如：ECDHE）与新型PQC（例如：ML-KEM）结合起来进行密钥交换的方法。目前，主流浏览器和云服务中这种方式的试验性导入正在快速推进。&lt;/p>
&lt;h3 id="实现密码敏捷性crypto-agility">实现密码敏捷性（Crypto-Agility）
&lt;/h3>&lt;p>企业和系统开发者今后最应该意识到的是确保 &lt;strong>“密码敏捷性（Crypto-Agility）”&lt;/strong>。当未来算法被发现缺陷或出现新标准时，必须具备能够在不停止系统的情况下，迅速更换和更新密码算法的灵活架构设计。&lt;/p>
&lt;p>准确掌握自己系统内部“在哪里”、“使用了什么密码”、“为了什么目的”，从而制定密码材料清单（CBOM：Cryptography Bill of Materials），是迈向PQC迁移的重要第一步。&lt;/p>
&lt;hr>
&lt;h2 id="结语为即将到来的q-day做好准备">结语：为即将到来的“Q-Day”做好准备
&lt;/h2>&lt;p>量子计算机的进化在为人类带来巨大恩惠的同时，也是对作为现代数字社会基石的密码安全的最大威胁。后量子密码学（PQC）已不再是“遥远未来的研究课题”。经历了NIST发布FIPS标准这一里程碑，PQC已正式进入了全面的“实施与迁移”阶段。&lt;/p>
&lt;p>考虑到“Harvest Now, Decrypt Later”的威胁，对于所有处理高度机密数据的组织而言，向PQC迁移是“现在立即”就应该着手进行的最优先课题。让我们深刻理解新一代密码技术，提高系统的密码敏捷性，从而安全地度过即将到来的量子计算机时代。&lt;/p></description></item><item><title>破解互联网密码的人类最强数学“一般数域筛选法（GNFS）”是什么？</title><link>http://kenji.blog/zh-cn/p/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E6%9A%97%E5%8F%B7%E3%82%92%E7%A0%B4%E3%82%8B%E4%BA%BA%E9%A1%9E%E6%9C%80%E5%BC%B7%E3%81%AE%E6%95%B0%E5%AD%A6%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%A8%E3%81%AF/</link><pubDate>Sat, 05 Sep 2026 02:09:08 +0900</pubDate><guid>http://kenji.blog/zh-cn/p/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E6%9A%97%E5%8F%B7%E3%82%92%E7%A0%B4%E3%82%8B%E4%BA%BA%E9%A1%9E%E6%9C%80%E5%BC%B7%E3%81%AE%E6%95%B0%E5%AD%A6%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%A8%E3%81%AF/</guid><description>&lt;img src="http://kenji.blog/p/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E6%9A%97%E5%8F%B7%E3%82%92%E7%A0%B4%E3%82%8B%E4%BA%BA%E9%A1%9E%E6%9C%80%E5%BC%B7%E3%81%AE%E6%95%B0%E5%AD%A6%E4%B8%80%E8%88%AC%E6%95%B0%E4%BD%93%E7%AF%A9%E6%B3%95gnfs%E3%81%A8%E3%81%AF/gnfs_two_worlds_1788542142485.jpg" alt="Featured image of post 破解互联网密码的人类最强数学“一般数域筛选法（GNFS）”是什么？" />&lt;h1 id="破解互联网密码的人类最强数学一般数域筛选法gnfs是什么">破解互联网密码的人类最强数学“一般数域筛选法（GNFS）”是什么？
&lt;/h1>&lt;p>我们每天使用的互联网，无论是LINE消息、YouTube还是在Amazon上购物，所有的通信都受到“密码”的保护。
目前，全世界使用最广泛的密码代表就是“RSA密码”。&lt;/p>
&lt;p>RSA密码防御的核心非常简单。那就是利用了 &lt;strong>“即使是计算机也无法解开巨大数字的质因数分解”&lt;/strong> 这一数学性质。
例如，如果是“15”，我们很快就能知道是“3 × 5”，但如果这变成一个“270位的数字”，即使把全世界的超级计算机联合起来，也需要几亿年才能解开。&lt;/p>
&lt;p>然而，数学家们也没有沉默。为了打破这个坚不可摧的密码，人类创造出了一种如同魔法般的算法（计算步骤）——&lt;strong>“一般数域筛选法（GNFS：General Number Field Sieve）”&lt;/strong>。&lt;/p>
&lt;p>在这篇文章中，我们将不使用任何专业术语，仅凭 &lt;strong>初中学的数学知识（质因数分解、代数式、最大公约数）&lt;/strong>，分步为您完全解析这个“人类最强算法”破解密码的奥秘！&lt;/p>
&lt;hr>
&lt;h2 id="第1章密码破译的目标是初三的公式">第1章：密码破译的目标是“初三的公式”
&lt;/h2>&lt;p>面对巨大的质因数分解，最大的必杀技就是初三年级学的这个公式。&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>$X^2 - Y^2 = (X + Y)(X - Y)$&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>你可能会想：“哎，这么基础的公式就能破解密码吗？”但正是这个公式，是解开一切的大师级钥匙。&lt;/p>
&lt;p>破解密码的最大目标，是对于一个巨大的数字 $N$，
找到 &lt;strong>“将 $X^2$ 和 $Y^2$ 除以 $N$ 后的余数相同的数字（$X$ 和 $Y$）”&lt;/strong>。&lt;/p>
&lt;h3 id="为什么余数相同就能解开密码">为什么“余数相同”就能解开密码？
&lt;/h3>&lt;p>假设有两个数字 $X^2$ 和 $Y^2$，“除以 $N$ 的余数相同”。
余数相同意味着，&lt;strong>做减法得到的“$X^2 - Y^2$”，必定能被 $N$ 整除（成为 $N$ 的倍数）&lt;/strong>，这是一个法则。&lt;/p>
&lt;p>这里，假设用于密码的巨大数字 $N$ 是由两个秘密的质数（$p$ 和 $q$）相乘得到的（$N = p \times q$）。&lt;/p>
&lt;p>将 $X^2 - Y^2$ 进行因式分解，就变成了 &lt;strong>$(X - Y)(X + Y)$&lt;/strong>。
这既然是 $N$ 的倍数，就意味着在这个乘法中的某个地方，隐藏着秘密的质数 $p$ 和 $q$。&lt;/p>
&lt;p>奇迹在此发生。
这两个质数 $p$ 和 $q$，&lt;strong>“$p$ 进入 $(X - Y)$ 的房间”、“$q$ 进入 $(X + Y)$ 的房间”&lt;/strong>，被分到不同房间的概率，在数学上是 ** 50%（二分之一）**。&lt;/p>
&lt;p>在只有质数 $p$ 进入了 $(X - Y)$ 房间的状态下，让我们来计算 $(X - Y)$ 和 $N$ 的 &lt;strong>“最大公约数（最大的共同部分）”&lt;/strong>。&lt;/p>
&lt;ul>
&lt;li>$(X - Y)$ 的内容 ＝ $p \times$ 某个数&lt;/li>
&lt;li>$N$ 的内容 ＝ $p \times q$
共同的部分只有 &lt;strong>“$p$”&lt;/strong> 吧！&lt;/li>
&lt;/ul>
&lt;p>也就是说，在计算出最大公约数的瞬间，隐藏着的质数 $p$ 就会掉落出来，密码也就被完全破译了。（※使用“辗转相除法”，即使在智能手机上也能瞬间计算出最大公约数）&lt;/p>
&lt;p>&lt;strong>【小专栏：为什么是平方？三次方或两倍不行吗？】&lt;/strong>&lt;/p>
&lt;blockquote>
&lt;p>如果是“$2X - 2Y$”，就会变成 $2(X - Y)$，因为只有一个房间，所以无法分离出质数。如果是“$X^3 - Y^3$”，房间的大小会变得不平衡，计算量会无谓地增加。为了将质数分离成两个，能优美地分成两个房间的“平方”性价比最高。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="第2章如何寻找x和y收集质数卡片的拼图">第2章：如何寻找X和Y？“收集质数卡片的拼图”
&lt;/h2>&lt;p>目标已经明确。然而，即使盲目地去寻找“余数相同的 $X^2$ 和 $Y^2$”，直到宇宙寿命结束也找不到。
于是，数学家们想出了一个极其天才的方法，称为 &lt;strong>“收集质数卡片的拼图”&lt;/strong>。&lt;/p>
&lt;h3 id="step-1用筛子只收集沙金平滑数">Step 1：用筛子只收集沙金（平滑数）
&lt;/h3>&lt;p>首先，准备一个随意的数字 $Z$，计算其平方后除以 $N$ 的余数 $W$。
（$Z^2 = W$ 的余数世界）&lt;/p>
&lt;p>将得到的余数 $W$ 进行质因数分解。这里，只有当出现 &lt;strong>“仅由 2, 3, 5, 7 等小质数组成的 $W$”&lt;/strong> 时，才将该式子作为“中奖卡片”保留下来；如果混杂了大的质数就丢掉。
这就好比在河里用筛子把大石头过滤掉，只收集沙金一样的作业。&lt;/p>
&lt;h3 id="step-2全部变成偶数个的拼图">Step 2：全部变成“偶数个”的拼图
&lt;/h3>&lt;p>例如，假设收集到了以下 3 张沙金卡片：&lt;/p>
&lt;ul>
&lt;li>卡片A： $Z_1^2 = 2^3 \times 3^1$&lt;/li>
&lt;li>卡片B： $Z_2^2 = 2^1 \times 5^1$&lt;/li>
&lt;li>卡片C： $Z_3^2 = 3^1 \times 5^1$&lt;/li>
&lt;/ul>
&lt;p>我们把它们全部相乘看看。
右侧变成 $(2^3 \times 3^1) \times (2^1 \times 5^1) \times (3^1 \times 5^1)$，
整理后变成 &lt;strong>“$2^4 \times 3^2 \times 5^2$”&lt;/strong>。&lt;/p>
&lt;p>不可思议的是，质数的个数变成了“4个、2个、2个”，&lt;strong>全部都是偶数个&lt;/strong>！
全部都是偶数个，意味着把整体的个数减半，就会变成“某个数的平方”。
也就是说，$(2^2 \times 3^1 \times 5^1)^2 = (60)^2$。&lt;/p>
&lt;p>左侧是 $(Z_1 \times Z_2 \times Z_3)^2$，这样一来，终于
&lt;strong>$X = (Z_1 \times Z_2 \times Z_3)$&lt;/strong>
&lt;strong>$Y = 60$&lt;/strong>
这组期待已久的“$X^2 = Y^2$”就完成了！&lt;/p>
&lt;p>对于计算机来说，计算质数个数是“偶数还是奇数（0还是1）”的拼图是它非常擅长的，所以用这种方法能高速地找到 $X$ 和 $Y$。&lt;/p>
&lt;hr>
&lt;h2 id="第3章阻挡在前的绝望之墙">第3章：阻挡在前的绝望之墙
&lt;/h2>&lt;p>这样就能解开任何密码了！……正当这么想时，大问题发生了。
如果密码数字 $N$ 在“100位”左右，用这个方法（称为二次筛选法）还能解开；但如果 $N$ 变成“200位、300位”，计算途中出现的 $W$ 就会变得太大。&lt;/p>
&lt;p>数字太大的话，“仅由小质数组成的数（沙金）”就会彻底不再出现。这会变得比在沙漠里找隐形眼镜还难，完全收集不到用来解开拼图的卡片。&lt;/p>
&lt;p>在这里，人类的终极武器 &lt;strong>“一般数域筛选法（GNFS）”&lt;/strong> 终于登场了。&lt;/p>
&lt;hr>
&lt;h2 id="第4章人类最强的点子创造两个世界">第4章：人类最强的点子，创造“两个世界”
&lt;/h2>&lt;p>GNFS 的天才构想是：&lt;strong>“因为只在现实世界里计算，所以数字才会变大。那么，就创造一个使用多项式（代数式）的『里世界』，把计算的负担分散成两份吧。”&lt;/strong>&lt;/p>
&lt;h3 id="代数式的魔法">代数式的魔法
&lt;/h3>&lt;p>GNFS 利用一个基准数 $m$，将巨大的数字 $N$ 转换为代数式。
例如，如果 $N=100$，设 $m=4$，则 $100 = 4^3 + 2(4^2) + 4$。
使用字母 $x$，将其变为 &lt;strong>$f(x) = x^3 + 2x^2 + x$&lt;/strong> 这样一个式子（里世界）。&lt;/p>
&lt;p>这个式子有趣的地方在于，它具有 &lt;strong>“只要将 $m$（上例中是4）代入字母 $x$，就随时能穿越回到现实的数字 $N$”&lt;/strong> 这一性质。&lt;/p>
&lt;h3 id="在两个世界同时寻找沙金">在两个世界同时寻找沙金
&lt;/h3>&lt;p>GNFS 会制造许多随意的整数对 $(a, b)$，并同时进行以下两个计算：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>现实世界&lt;/strong>： $a - b \times m$&lt;/li>
&lt;li>&lt;strong>代数式世界&lt;/strong>： 用代数式的规则计算出的 $a - b \times x$ 的值&lt;/li>
&lt;/ol>
&lt;p>通过将问题分为两个世界，所处理的数字尺寸就会剧烈减小（变轻）。这就像是把一块巨岩劈成两半，变成易于处理的石块的感觉。&lt;/p>
&lt;p>然后，只有当 &lt;strong>“在现实世界和代数式世界中，两边都『仅由小质数组成（沙金）』”&lt;/strong> 时，才用筛子把这种奇迹般的数对 $(a, b)$ 筛选出来并收集。这就是“数域筛选法”这个名字的由来。&lt;/p>
&lt;h3 id="密码终于被破译的瞬间">密码终于被破译的瞬间
&lt;/h3>&lt;p>当从两个世界收集到数千万张“沙金卡片”后，就利用超级计算机庞大的矩阵计算，找出在第2章做过的“质数个数全部变成偶数的组合”。&lt;/p>
&lt;p>找到组合后：&lt;/p>
&lt;ul>
&lt;li>将在现实世界中形成的平方数设为 &lt;strong>$X^2$&lt;/strong>&lt;/li>
&lt;li>将在代数式世界中形成的平方代数式设为 &lt;strong>$Y(x)^2$&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>最后，将 $m$ 代入代数式 $Y(x)$ 的 $x$ 中，使其穿越到现实世界并汇合。
于是，就像数学魔法一样，&lt;strong>“$X^2$ 和 $Y^2$ 的余数相同”&lt;/strong> 的状态就严密地完成了！&lt;/p>
&lt;p>剩下的就如第1章所述，只要计算 $X - Y$ 和 $N$ 的最大公约数，坚不可摧的RSA密码就会轰然崩塌，秘密的质数就会显露出来。&lt;/p>
&lt;hr>
&lt;h2 id="结语数学永无止境">结语：数学永无止境
&lt;/h2>&lt;p>你可能会想：“太好了，用 GNFS 就能破解任何密码了吧！”
但是，RSA 密码也没有认输。目前互联网上使用的是被称为“RSA-2048（约 617 位）”的怪物般的巨大数字。&lt;/p>
&lt;p>不管 GNFS 作为人类最强算法有多厉害，据说仅仅是解开 270 位数（RSA-270），即使把全世界的计算机连接起来，也需要几千年、几万年。就目前而言，我们的 LINE 和银行数据是安全的。&lt;/p>
&lt;p>然而，如果出现了 &lt;strong>“无论多巨大的数字，都能瞬间找到 $X$ 和 $Y$ 的魔法”&lt;/strong>，那会怎么样呢？
其实，最接近这种魔法的存在就是目前正在开发中的 &lt;strong>“量子计算机（Shor 算法）”&lt;/strong>。在数学上已经证明，如果利用量子力学的波动性质，就能无视麻烦的卡片收集拼图，一击命中答案。&lt;/p>
&lt;p>制造密码的人（防御）与制造破解密码算法的人（攻击）之间无止境的智慧较量。
当你知道初中学到的“质因数分解”和“代数式”，其实是活跃在世界安全最前线激烈交锋的武器时，是不是觉得数学课稍微变得有趣了一点呢？&lt;/p>
&lt;p>发现未来最强算法的，也许就是正在读这篇文章的你！&lt;/p>
&lt;hr>
&lt;p>&lt;em>(※本文是为了向初中生概念化地展示密码破译的数学魅力而写的。实际的 GNFS 使用了代数域的理想类群、同态映射等高级大学数学知识进行严密计算。)&lt;/em>&lt;/p></description></item><item><title>考拉兹猜想</title><link>http://kenji.blog/zh-cn/p/%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E4%BA%88%E6%83%B3/</link><pubDate>Tue, 15 Jul 2025 18:03:03 +0900</pubDate><guid>http://kenji.blog/zh-cn/p/%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E4%BA%88%E6%83%B3/</guid><description>&lt;img src="http://kenji.blog/p/%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E4%BA%88%E6%83%B3/img.png" alt="Featured image of post 考拉兹猜想" />&lt;h1 id="任何数字最终都会变成1是真的吗玩转考拉兹猜想">“任何数字最终都会变成1”是真的吗？——玩转考拉兹猜想
&lt;/h1>&lt;p>大家好！我是kenji。&lt;/p>
&lt;p>突然问一下，如果你听说“任何数字最终都会变成1的规则”，
会不会觉得有些不可思议？&lt;/p>
&lt;blockquote>
&lt;p>比如19，或者87，甚至1000000也是如此。
按照特定的规则去处理数字，不知为何最后都会收敛到“1”。&lt;/p>
&lt;/blockquote>
&lt;p>像梦一样的故事，这就是 &lt;strong>考拉兹猜想（Collatz Conjecture）&lt;/strong>。&lt;/p>
&lt;hr>
&lt;h2 id="考拉兹猜想究竟是什么">考拉兹猜想究竟是什么？
&lt;/h2>&lt;p>首先介绍一下规则。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>起点：选择任意一个 &lt;strong>正整数&lt;/strong>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>操作：&lt;/p>
&lt;ul>
&lt;li>如果是偶数 → 减半（n → n / 2）&lt;/li>
&lt;li>如果是奇数 → 乘以3再加1（n → 3n + 1）&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>一直重复这个过程，猜想认为 &lt;strong>任何数字最终都会到达1&lt;/strong>。&lt;/p>
&lt;p>比如，从 &lt;code>6&lt;/code> 开始：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>确实变成了“1”。欢迎回来！&lt;/p>
&lt;hr>
&lt;h2 id="用代码试试看用python写考拉兹猜想">用代码试试看：用Python写考拉兹猜想
&lt;/h2>&lt;p>好了，这种时候写代码测试最快！
让我们用Python输出一下“考拉兹数列”。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">collatz&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">steps&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="mi">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">3&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">steps&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">steps&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 例子：从19开始&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">collatz&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">19&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>运行结果：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">[19, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>完美到达了1。
虽然绕了不少远路，但最后还是顺利冲过终点！&lt;/p>
&lt;p>顺便说一下，即使从 27 开始，也同样会到达1。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">collatz&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">27&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>运行结果：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">[27, 82, 41, 124, 62, 31, 94, 47, 142, 71, 214, 107, 322, 161, 484, 242,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121, 364, 182, 91, 274, 137, 412, 206, 103, 310, 155, 466, 233, 700, 350,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">175, 526, 263, 790, 395, 1186, 593, 1780, 890, 445, 1336, 668, 334, 167,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">502, 251, 754, 377, 1132, 566, 283, 850, 425, 1276, 638, 319, 958, 479,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1438, 719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644, 1822, 911,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2734, 1367, 4102, 2051, 6154, 3077, 9232, 4616, 2308, 1154, 577, 1732,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">866, 433, 1300, 650, 325, 976, 488, 244, 122, 61, 184, 92, 46, 23, 70, 35,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>竟然花了111步！&lt;/p>
&lt;p>而且，中途还有膨胀到9000以上的阶段。
这真是绕了天大的远路才到达终点的模式啊。&lt;/p>
&lt;hr>
&lt;h2 id="那么到底哪里厉害呢">那么，到底哪里厉害呢？
&lt;/h2>&lt;p>这个猜想的厉害之处在于，&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>虽然还没有被证明，但似乎不管用什么数字来算都会变成1&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>这一点。&lt;/p>
&lt;p>诶？那1兆呢，1京呢……？&lt;/p>
&lt;p>能想到这点的你很敏锐。
实际上，用计算机已经验证到了“2的68次方”左右，
&lt;strong>全部都到达了1&lt;/strong>。难以置信……。&lt;/p>
&lt;p>但是，&lt;strong>“全部都会这样”并没有在理论上被证明&lt;/strong>。
这就是数学世界里的“未解决问题”。&lt;/p>
&lt;hr>
&lt;h2 id="考拉兹是谁">考拉兹是谁？
&lt;/h2>&lt;p>读到这里，你肯定会想“考拉兹到底是谁？”吧。
下面就好好介绍一下！&lt;/p>
&lt;ul>
&lt;li>姓名：&lt;strong>洛塔尔·考拉兹（Lothar Collatz）&lt;/strong>&lt;/li>
&lt;li>国籍：德国&lt;/li>
&lt;li>生卒年：1910年〜1990年&lt;/li>
&lt;li>头衔：数学家（活跃于泛函分析和数论领域）&lt;/li>
&lt;/ul>
&lt;p>他在1937年提出了这个猜想，
此后，在长达80多年的时间里，&lt;strong>谁也没能证明，也没能推翻&lt;/strong>。&lt;/p>
&lt;p>顺便一提，这个问题虽然如此简单，却又无比深奥，
以至于连保罗·埃尔德什（超著名的数学家）都这样说过：&lt;/p>
&lt;blockquote>
&lt;p>“数学还没有成熟到足以解决考拉兹猜想。”&lt;/p>
&lt;/blockquote>
&lt;p>也就是说，人类的数学水平可能还没赶上这个谜团……。&lt;/p>
&lt;hr>
&lt;h2 id="不需要复杂的公式">不需要“复杂的公式”
&lt;/h2>&lt;p>考拉兹猜想的美妙之处在于，&lt;strong>任何人都能玩&lt;/strong>。&lt;/p>
&lt;p>只要有纸和笔就能算。
用Python写几行代码，就能自动测试。
不仅如此，&lt;strong>最顶尖的数学家们也在认真挑战它&lt;/strong>。&lt;/p>
&lt;p>怎么样，是不是让人热血沸腾？&lt;/p>
&lt;hr>
&lt;h2 id="彩蛋一次性测试的代码">彩蛋：一次性测试的代码
&lt;/h2>&lt;p>这里也附上可以一次性测试多个数字的代码。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">21&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">steps&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collatz&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">steps&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">（步数: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">steps&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">）&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>这能一口气输出“1～20”的考拉兹数列。&lt;/p>
&lt;hr>
&lt;h2 id="结论这个世界果然很不可思议">结论：这个世界，果然很不可思议
&lt;/h2>&lt;p>这就是考拉兹猜想。&lt;/p>
&lt;ul>
&lt;li>明明极其简单&lt;/li>
&lt;li>却没人能证明&lt;/li>
&lt;li>在数学界是个大难题&lt;/li>
&lt;/ul>
&lt;p>它就像是一个不可思议的集合体。&lt;/p>
&lt;p>即使是编程初学者也能尝试，请务必玩玩看哦〜！&lt;/p>
&lt;hr>
&lt;h2 id="推荐链接面向感兴趣的人">推荐链接（面向感兴趣的人）
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://zh.wikipedia.org/wiki/%e8%80%83%e6%8b%89%e5%85%b9%e7%8c%9c%e6%83%b3" target="_blank" rel="noopener"
>维基百科：考拉兹猜想&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://arxiv.org/abs/1909.03562" target="_blank" rel="noopener"
>陶哲轩论文（英文）&lt;/a>&lt;/li>
&lt;li>用Python做一个可视化版本也会很有趣哦！（如果有需求我会做的）&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>如果想了解更多这种“不可思议的数学×编程”题材，
请随时向我提出“想了解更多”的请求。
之后，我还会介绍黎曼猜想、素数的故事等各种内容！&lt;/p>
&lt;hr>
&lt;p>📮结束！&lt;/p>
&lt;hr></description></item><item><title>P≠NP猜想</title><link>http://kenji.blog/zh-cn/p/pnp%E4%BA%88%E6%83%B3/</link><pubDate>Wed, 11 Sep 2024 02:22:39 +0900</pubDate><guid>http://kenji.blog/zh-cn/p/pnp%E4%BA%88%E6%83%B3/</guid><description>&lt;h1 id="概要">概要
&lt;/h1>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">P类问题是指在确定性图灵机上，能够在多项式时间内判定的问题类别。而NP类问题是指，当给定一个“是”的证据（称为Witness）时，能够在多项式时间内验证该Witness正确性的问题类别。由于在多项式时间内可以判定的问题，也必定能在多项式时间内被验证，因此P⊆NP是显而易见的。但P是否为NP的真子集，目前尚不明确。尽管目前尚未得到证明，但大多数研究人员都相信P≠NP。这种认为P类问题与NP类问题不相等的猜想，就被称为“P≠NP猜想”。
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>参考网站 : &lt;a class="link" href="https://daigakudenki.com/np-hard/" target="_blank" rel="noopener"
>https://daigakudenki.com/np-hard/&lt;/a>&lt;/p></description></item><item><title>爱因斯坦的名言</title><link>http://kenji.blog/zh-cn/p/%E3%82%A2%E3%82%A4%E3%83%B3%E3%82%B7%E3%83%A5%E3%82%BF%E3%82%A4%E3%83%B3%E3%81%AE%E5%90%8D%E8%A8%80/</link><pubDate>Sat, 24 Aug 2024 18:38:47 +0900</pubDate><guid>http://kenji.blog/zh-cn/p/%E3%82%A2%E3%82%A4%E3%83%B3%E3%82%B7%E3%83%A5%E3%82%BF%E3%82%A4%E3%83%B3%E3%81%AE%E5%90%8D%E8%A8%80/</guid><description>&lt;img src="http://kenji.blog/p/%E3%82%A2%E3%82%A4%E3%83%B3%E3%82%B7%E3%83%A5%E3%82%BF%E3%82%A4%E3%83%B3%E3%81%AE%E5%90%8D%E8%A8%80/Solvay_conference_1927.jpg" alt="Featured image of post 爱因斯坦的名言" />&lt;p>大家好！&lt;/p>
&lt;p>今天，我想和大家分享一下爱因斯坦的名言。&lt;/p>
&lt;hr>
&lt;h2 id="世界不会评价你的善行">世界不会评价你的善行？
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">世界绝不会评价你做的一百万件善事。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">但是，它会批评你做的一件错事...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">但是，请不要气馁
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">“请始终超越所有的嘲笑和批评，站起来。保持坚强。”
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- 阿尔伯特·爱因斯坦
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>这是据说由爱因斯坦说出的话。它尖锐地指出了我们每天感受到的社会的严酷以及人们评价的偏见。&lt;/p>
&lt;hr>
&lt;h2 id="尽管如此继续站起来">尽管如此，继续站起来
&lt;/h2>&lt;p>“请始终超越所有的嘲笑和批评，站起来。保持坚强。”&lt;/p>
&lt;p>接着的这句话，可以说是爱因斯坦对上述严酷现实的回答。它教导我们不要屈服于批评和嘲笑，相信自己并继续前进的重要性。&lt;/p>
&lt;hr>
&lt;h2 id="将爱因斯坦的教诲应用于日常生活">将爱因斯坦的教诲应用于日常生活
&lt;/h2>&lt;p>这句名言也与我们的日常生活息息相关。例如，在工作场所的努力没有得到认可，只有微小的错误显得突出。此外，在社交媒体上的发言也可能被断章取义地批评。&lt;/p>
&lt;p>在那种时候，请试着回想一下爱因斯坦的这句话。不要因为他人的评价而患得患失，坚持自己的信念才是最重要的。&lt;/p>
&lt;hr>
&lt;h2 id="总结">总结
&lt;/h2>&lt;p>爱因斯坦的这句名言教导了我们“不被他人的评价所左右，相信自己而活”的重要性。不要输给批评和嘲笑，让我们拥有走向自己相信的道路的勇气。&lt;/p>
&lt;p>最后，再重温一次爱因斯坦的话。&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>“请始终超越所有的嘲笑和批评，站起来。保持坚强。”&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>希望这句话能引起你的共鸣，并成为你迈出积极一步的契机。&lt;/p></description></item><item><title>生成素数的C语言代码</title><link>http://kenji.blog/zh-cn/p/%E7%B4%A0%E6%95%B0%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8Bc%E8%A8%80%E8%AA%9E%E3%82%B3%E3%83%BC%E3%83%89/</link><pubDate>Sat, 24 Aug 2024 09:38:10 +0900</pubDate><guid>http://kenji.blog/zh-cn/p/%E7%B4%A0%E6%95%B0%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8Bc%E8%A8%80%E8%AA%9E%E3%82%B3%E3%83%BC%E3%83%89/</guid><description>&lt;img src="http://kenji.blog/p/%E7%B4%A0%E6%95%B0%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8Bc%E8%A8%80%E8%AA%9E%E3%82%B3%E3%83%BC%E3%83%89/img.png" alt="Featured image of post 生成素数的C语言代码" />&lt;p>以下是一个简单的C语言代码，用于生成指定范围内的素数。在这个例子中，我们列举出1到n之间的素数。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;stdio.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;stdbool.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">bool&lt;/span> &lt;span class="nf">isPrime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">num&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">num&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">num&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">num&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="n">num&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">3&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">num&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="mi">6&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">num&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="n">num&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">printPrimes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;2 &amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">isPrime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;%d &amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;请输入生成素数范围的最大值: &amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">scanf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;%d&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;1到%d的素数如下:&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">n&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">printPrimes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>这段代码的运行机制如下：&lt;/p>
&lt;ol>
&lt;li>isPrime函数：判断给定的数是否为素数。出于效率考虑，首先检查是否能被2和3整除，然后步长为6进行后续检查。&lt;/li>
&lt;li>printPrimes函数：输出指定范围内的素数。首先输出2，之后只检查奇数。&lt;/li>
&lt;li>main函数：接收用户输入的范围最大值，并输出该范围内的素数。&lt;/li>
&lt;/ol>
&lt;p>编译并运行此代码后，将会显示指定范围内的素数。&lt;/p></description></item><item><title>Mathematica入门</title><link>http://kenji.blog/zh-cn/p/mathematica%E5%85%A5%E9%96%80/</link><pubDate>Thu, 25 Jul 2024 01:36:19 +0900</pubDate><guid>http://kenji.blog/zh-cn/p/mathematica%E5%85%A5%E9%96%80/</guid><description>&lt;img src="http://kenji.blog/p/mathematica%E5%85%A5%E9%96%80/img.png" alt="Featured image of post Mathematica入门" />&lt;h1 id="mathematica入门">Mathematica入门
&lt;/h1>&lt;h2 id="解方程">解方程
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Solve[x^2 - 3 x + 2 == 0, x]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{{x -&amp;gt; 1}, {x -&amp;gt; 2}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="在整数范围内求方程的解">在整数范围内求方程的解
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Solve[x^2 - 3 x + 2 == 0 &amp;amp;&amp;amp; 0 &amp;lt;= x &amp;lt;= 2, x, Integers]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{{x -&amp;gt; 1}, {x -&amp;gt; 2}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="解方程组">解方程组
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Solve[{x + y == 3, x - y == 1}, {x, y}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{{x -&amp;gt; 2, y -&amp;gt; 1}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="解不等式">解不等式
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Reduce[x^2 - 3 x + 2 &amp;gt; 0, x]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">x &amp;lt; 1 || x &amp;gt; 2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="微分">微分
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">D[x^2, x]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">2 x
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="积分">积分
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Integrate[x^2, x]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">x^3/3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="求极限">求极限
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Limit[1/x, x -&amp;gt; 0]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Infinity
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="求级数">求级数
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Sum[1/n^2, {n, 1, Infinity}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">π^2/6
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="创建矩阵">创建矩阵
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">m = {{1, 2}, {3, 4}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="求矩阵乘积">求矩阵乘积
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">m . m
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{{7, 10}, {15, 22}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="求逆矩阵">求逆矩阵
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Inverse[m]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{{-2, 1}, {1.5, -0.5}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="求特征值与特征向量">求特征值与特征向量
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Eigensystem[m]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{{5, 0}, {{1, 1}, {1, -1}}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="求向量的点积">求向量的点积
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{1, 2} . {3, 4}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">11
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="求向量的叉积">求向量的叉积
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Cross[{1, 2, 3}, {4, 5, 6}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{-3, 6, -3}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="求向量的模大小">求向量的模（大小）
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Norm[{1, 2, 3}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">√14
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="求向量的夹角">求向量的夹角
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">ArcCos[{1, 2} . {3, 4}/(Norm[{1, 2}] Norm[{3, 4}])]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">ArcCos[11/(√5 √25)]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="求向量的投影">求向量的投影
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{1, 2} . {3, 4}/Norm[{3, 4}] {3, 4}/Norm[{3, 4}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{11/5, 22/5}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="求向量的旋转">求向量的旋转
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">RotationMatrix[π/2].{1, 0}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{0, 1}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="求向量的平移">求向量的平移
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">TranslationTransform[{1, 2}][{3, 4}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{4, 6}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="求向量的缩放">求向量的缩放
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">ScalingTransform[{2, 3}][{1, 1}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{2, 3}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="求向量的反转反射">求向量的反转（反射）
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">ReflectionTransform[{1, 1}][{1, 1}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{0, 0}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="生成随机数">生成随机数
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">RandomReal[]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">0.123456
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="生成随机数整数">生成随机数（整数）
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">RandomInteger[]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">123456
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="生成随机数指定范围">生成随机数（指定范围）
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">RandomReal[{1, 10}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">5.6789
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="生成随机数整数指定范围">生成随机数（整数、指定范围）
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">RandomInteger[{1, 10}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="生成随机数指定分布">生成随机数（指定分布）
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">RandomVariate[NormalDistribution[0, 1]]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">0.123456
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="生成随机数指定分布指定数量">生成随机数（指定分布、指定数量）
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">RandomVariate[NormalDistribution[0, 1], 10]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{0.123456, 0.234567, ..., 0.987654}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="生成随机数指定分布指定数量指定种子">生成随机数（指定分布、指定数量、指定种子）
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">SeedRandom[12345]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RandomVariate[NormalDistribution[0, 1], 10]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{0.123456, 0.234567, ..., 0.987654}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="对数组元素应用函数">对数组元素应用函数
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Map[Sqrt, {1, 4, 9}]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Sqrt /@ {1, 4, 9}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Map[#^(1/2)&amp;amp;, {1, 4, 9}]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{1, 2, 3}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="使用lambda表达式定义函数">使用Lambda表达式定义函数
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">f = Function[x, x^2]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">f[3]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">9
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="复合函数">复合函数
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">f = Function[x, x^2]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">g = Function[x, x + 1]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">h = Function[x, f[g[x]]]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">h[3]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">16
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="引用上一次的计算结果">引用上一次的计算结果
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">% + 1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">17
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="纯函数">纯函数
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">(#+3)&amp;amp;[5]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">8
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="数组提取">数组提取
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Select[{1, 2, 3, 4, 5}, EvenQ]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Select[{1, 2, 3, 4, 5}, Mod[#,2]==0&amp;amp;]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>输出&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">{2, 4}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div></description></item><item><title>什么是生日悖论</title><link>http://kenji.blog/zh-cn/p/%E3%83%90%E3%83%BC%E3%82%B9%E3%83%87%E3%82%A4%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9%E3%81%A8%E3%81%AF/</link><pubDate>Tue, 02 Apr 2024 01:20:50 +0900</pubDate><guid>http://kenji.blog/zh-cn/p/%E3%83%90%E3%83%BC%E3%82%B9%E3%83%87%E3%82%A4%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9%E3%81%A8%E3%81%AF/</guid><description>&lt;img src="http://kenji.blog/p/%E3%83%90%E3%83%BC%E3%82%B9%E3%83%87%E3%82%A4%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9%E3%81%A8%E3%81%AF/img.png" alt="Featured image of post 什么是生日悖论" />&lt;h2 id="你知道生日悖论吗">你知道生日悖论吗？
&lt;/h2>&lt;p>我来说一个有点不可思议的话题。
你认为聚集多少人，“有相同生日的人的概率”才会变高呢？&lt;/p>
&lt;p>例如，一年有365天，所以如果说“聚集23人，有人生日相同的概率在50%以上”……总觉得有点违反直觉吧。&lt;/p>
&lt;p>但是这，&lt;strong>真的是在50%以上。&lt;/strong>&lt;/p>
&lt;hr>
&lt;h2 id="为什么会发生这种事呢">为什么会发生这种事呢？
&lt;/h2>&lt;p>这种现象被称为“生日悖论”。
虽然名字叫“悖论”，但有着严谨的数学理由。&lt;/p>
&lt;p>设人数为“n”时，&lt;strong>没有人生日相同的概率&lt;/strong> 可以用以下公式求出：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">P(没有人生日相同) = 365/365 × 364/365 × 363/365 × ... × (365 - n + 1)/365
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>用1减去这个值，就能得出“有人生日相同的概率”。&lt;/p>
&lt;hr>
&lt;h2 id="看看结果">看看结果……
&lt;/h2>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>人数&lt;/th>
&lt;th>有相同生日的人的概率&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>10人&lt;/td>
&lt;td>约11.7%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>20人&lt;/td>
&lt;td>约41.1%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>23人&lt;/td>
&lt;td>&lt;strong>约50.7%（注意这里！）&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>30人&lt;/td>
&lt;td>约70.6%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>70人&lt;/td>
&lt;td>&lt;strong>竟然约99.9%！&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>也就是说，只需 &lt;strong>23人&lt;/strong>，就有超过一半的概率有人生日相同。
在学校的班级或者职场的会议中，似乎很容易就会出现这种情况呢。&lt;/p>
&lt;hr>
&lt;h2 id="总结直觉与数学的偏差很有趣">总结：直觉与数学的偏差很有趣
&lt;/h2>&lt;p>“生日悖论”是一个我们的直觉与实际的数学概率产生偏差的有趣例子。
了解这些，也许能在闲聊或问答中活跃气氛！&lt;/p>
&lt;hr>
&lt;h2 id="参考链接">参考链接
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://zh.wikipedia.org/wiki/%E7%94%9F%E6%97%A5%E6%82%96%E8%AE%BA" target="_blank" rel="noopener"
>生日悖论（Wikipedia）&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>数学的未解决问题</title><link>http://kenji.blog/zh-cn/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E6%9C%AA%E8%A7%A3%E6%B1%BA%E5%95%8F%E9%A1%8C/</link><pubDate>Sat, 02 Mar 2024 22:57:36 +0900</pubDate><guid>http://kenji.blog/zh-cn/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E6%9C%AA%E8%A7%A3%E6%B1%BA%E5%95%8F%E9%A1%8C/</guid><description>&lt;img src="http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E6%9C%AA%E8%A7%A3%E6%B1%BA%E5%95%8F%E9%A1%8C/img.png" alt="Featured image of post 数学的未解决问题" />&lt;h1 id="数学的未解决问题">数学的未解决问题
&lt;/h1>&lt;p>下面来介绍一些数学中的未解决问题。尽管问题本身非常简单，但仍有许多尚未被证明的问题。&lt;/p>
&lt;h2 id="完全数有无数个吗">完全数有无数个吗？
&lt;/h2>&lt;p>完全数是指除了自身以外的所有正约数之和等于其本身的自然数。
例如：&lt;/p>
&lt;ul>
&lt;li>6的约数有1、2、3，而1+2+3=6，因此它是完全数。&lt;/li>
&lt;li>28的约数有1、2、4、7、14，而1+2+4+7+14=28，因此它是完全数。&lt;/li>
&lt;/ul>
&lt;p>目前只发现了51个完全数，虽然人们猜想它有无数个，
但至今尚未被证明。&lt;/p>
&lt;h2 id="哥德巴赫猜想">哥德巴赫猜想
&lt;/h2>&lt;p>哥德巴赫猜想是指任何大于2的偶数都可以表示为两个素数之和。
（这里的素数是指除了1和自身之外没有其他约数的自然数。）&lt;/p>
&lt;p>例如：&lt;/p>
&lt;ul>
&lt;li>4=2+2&lt;/li>
&lt;li>6=3+3&lt;/li>
&lt;li>8=3+5&lt;/li>
&lt;li>10=3+7=5+5&lt;/li>
&lt;/ul>
&lt;p>问题本身非常简单，但至今仍未被证明。&lt;/p>
&lt;h2 id="黎曼猜想">黎曼猜想
&lt;/h2>&lt;p>黎曼猜想是指黎曼ζ函数的零点仅限于负偶数以及实部为 1/2 的复数。&lt;/p>
&lt;p>黎曼ζ函数是指，当$s$为复数、$n$为自然数时，由&lt;/p>
$$\zeta(s):=\sum _{n=1}^{\infty }{\frac {1}{n^{s}}}=1+{\frac {1}{2^{s}}}+{\frac {1}{3^{s}}}+{\frac {1}{4^{s}}}+\cdots$$
&lt;p>所定义的函数$\zeta$。&lt;/p></description></item><item><title>使用埃拉托斯特尼筛法列举1000以下的素数</title><link>http://kenji.blog/zh-cn/p/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A61000%E4%BB%A5%E4%B8%8B%E3%81%AE%E7%B4%A0%E6%95%B0%E3%82%92%E5%88%97%E6%8C%99%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</link><pubDate>Sun, 09 Apr 2023 12:54:24 +0900</pubDate><guid>http://kenji.blog/zh-cn/p/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A61000%E4%BB%A5%E4%B8%8B%E3%81%AE%E7%B4%A0%E6%95%B0%E3%82%92%E5%88%97%E6%8C%99%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/</guid><description>&lt;img src="http://kenji.blog/p/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A61000%E4%BB%A5%E4%B8%8B%E3%81%AE%E7%B4%A0%E6%95%B0%E3%82%92%E5%88%97%E6%8C%99%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/img.png" alt="Featured image of post 使用埃拉托斯特尼筛法列举1000以下的素数" />&lt;h2 id="什么是埃拉托斯特尼筛法">什么是埃拉托斯特尼筛法
&lt;/h2>&lt;p>埃拉托斯特尼筛法是一种用于列举小于等于某个数值的所有素数的算法。
算法非常简单，可以通过以下步骤实现：&lt;/p>
&lt;ol>
&lt;li>创建一个包含 N 个元素的 bool 值数组，并将所有元素初始化为 true&lt;/li>
&lt;li>将数组的第 0 个和第 1 个元素设为 false（因为 0 和 1 不是素数）&lt;/li>
&lt;li>如果数组的第 2 个元素为 true，则将 2 作为素数输出&lt;/li>
&lt;li>将数组中 $2^2$ 及以上的所有 2 的倍数位置的元素设为 false※&lt;/li>
&lt;li>如果数组的第 3 个元素为 true，则将 3 作为素数输出&lt;/li>
&lt;li>将数组中 $3^2$ 及以上的所有 3 的倍数位置的元素设为 false&lt;/li>
&lt;li>对于第 4 个、第 5 个、……、第 N 个元素，重复相同的处理&lt;/li>
&lt;/ol>
&lt;p>※ 之所以将平方以上的元素作为 false 的目标，是因为小于平方的数已经被处理过（列举已完成）。&lt;/p>
&lt;p>&lt;img src="http://kenji.blog/p/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A61000%E4%BB%A5%E4%B8%8B%E3%81%AE%E7%B4%A0%E6%95%B0%E3%82%92%E5%88%97%E6%8C%99%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/Animation_Sieb_des_Eratosthenes.gif"
width="445"
height="369"
srcset="http://kenji.blog/p/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A61000%E4%BB%A5%E4%B8%8B%E3%81%AE%E7%B4%A0%E6%95%B0%E3%82%92%E5%88%97%E6%8C%99%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/Animation_Sieb_des_Eratosthenes_hua63c6218ac9f9cdba93ccb20db392e0e_206214_480x0_resize_box_1.gif 480w, http://kenji.blog/p/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A61000%E4%BB%A5%E4%B8%8B%E3%81%AE%E7%B4%A0%E6%95%B0%E3%82%92%E5%88%97%E6%8C%99%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/Animation_Sieb_des_Eratosthenes_hua63c6218ac9f9cdba93ccb20db392e0e_206214_1024x0_resize_box_1.gif 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="120"
data-flex-basis="289px"
>&lt;/p>
&lt;h2 id="rust-中的实现">Rust 中的实现
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">fn main() {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> let n = 1000;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> let mut is_prime = vec![true; n+1];
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> is_prime[0] = false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> is_prime[1] = false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> for i in 2..=n {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> if is_prime[i] {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> println!(&amp;#34;{}&amp;#34;, i);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> let mut j = i * i;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> while j &amp;lt;= n {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> is_prime[j] = false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> j += i;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="稍微优化的版本">稍微优化的版本
&lt;/h2>&lt;p>考虑到以下几点，我们进行稍微优化后的实现：&lt;/p>
&lt;ul>
&lt;li>数组不使用 true 而是使用 false 进行初始化（这样更快）&lt;/li>
&lt;li>2 的倍数不是素数，所以省略将 2 的倍数元素设为 false 的处理&lt;/li>
&lt;li>不需要循环到 n，只需列举到 n 的平方根即可找出 n 以下的素数&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">fn main() {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> let n = 1000;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> let mut is_prime = vec![false; n+1];
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> is_prime[2] = true;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> for i in (3..=n).step_by(2) {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> is_prime[i] = true;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> for i in 3..=((n as f64).sqrt() as usize) {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> if is_prime[i] {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> let mut j = i * i;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> while j &amp;lt;= n {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> is_prime[j] = false;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> j += i * 2;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> for i in (2..=n).filter(|&amp;amp;x| is_prime[x]) {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> println!(&amp;#34;{}&amp;#34;, i);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="参考">参考
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9" target="_blank" rel="noopener"
>埃拉托斯特尼筛法&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>为什么我喜欢数学和计算机呢</title><link>http://kenji.blog/zh-cn/p/%E3%81%AA%E3%81%9C%E6%95%B0%E5%AD%A6%E3%82%84%E8%A8%88%E7%AE%97%E6%A9%9F%E3%81%8C%E5%A5%BD%E3%81%8D%E3%81%AA%E3%82%93%E3%81%A0%E3%82%8D%E3%81%86/</link><pubDate>Fri, 23 Sep 2022 01:56:52 +0900</pubDate><guid>http://kenji.blog/zh-cn/p/%E3%81%AA%E3%81%9C%E6%95%B0%E5%AD%A6%E3%82%84%E8%A8%88%E7%AE%97%E6%A9%9F%E3%81%8C%E5%A5%BD%E3%81%8D%E3%81%AA%E3%82%93%E3%81%A0%E3%82%8D%E3%81%86/</guid><description>&lt;img src="http://kenji.blog/p/%E3%81%AA%E3%81%9C%E6%95%B0%E5%AD%A6%E3%82%84%E8%A8%88%E7%AE%97%E6%A9%9F%E3%81%8C%E5%A5%BD%E3%81%8D%E3%81%AA%E3%82%93%E3%81%A0%E3%82%8D%E3%81%86/img.png" alt="Featured image of post 为什么我喜欢数学和计算机呢" />&lt;h2 id="试着思考了一下为什么我喜欢数学和计算机呢">试着思考了一下为什么我喜欢数学和计算机呢
&lt;/h2>&lt;h3 id="对所有人平等">对所有人平等
&lt;/h3>&lt;p>不分人、立场和地点，对相同的输入总是返回相同的输出。&lt;/p>
&lt;h3 id="规则明确">规则明确
&lt;/h3>&lt;p>规则明确设定，没有荒谬或不公。&lt;/p>
&lt;h3 id="得出的答案和理论永远正确">得出的答案和理论永远正确
&lt;/h3>&lt;p>不用担心一旦得出的答案以后会被改写。&lt;/p>
&lt;h3 id="难度适中">难度适中
&lt;/h3>&lt;p>总是有未解决的问题，随时可以挑战解决问题。&lt;/p></description></item><item><title>数学的伟人们</title><link>http://kenji.blog/zh-cn/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E5%81%89%E4%BA%BA%E3%81%9F%E3%81%A1/</link><pubDate>Thu, 22 Sep 2022 23:06:37 +0900</pubDate><guid>http://kenji.blog/zh-cn/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E5%81%89%E4%BA%BA%E3%81%9F%E3%81%A1/</guid><description>&lt;img src="http://kenji.blog/p/%E6%95%B0%E5%AD%A6%E3%81%AE%E5%81%89%E4%BA%BA%E3%81%9F%E3%81%A1/img.png" alt="Featured image of post 数学的伟人们" />&lt;h3 id="费马-p-de-fermat-1601-1665">费马 (P, de Fermat, 1601-1665)
&lt;/h3>&lt;p>17世纪代表性的法国数学家。对解析几何、概率论、微积分等进行了奠基工作。也是数论的始祖。&lt;/p>
&lt;h3 id="丢番图-diophantus-207左右-291左右">丢番图 (Diophantus, 207左右-291左右)
&lt;/h3>&lt;p>希腊数学家。以引入符号系统和研究有理数解而闻名。代表作是《算术》。求方程式有理数解的分支被称为丢番图分析。&lt;/p>
&lt;h3 id="欧拉-l-euler-1707-1783">欧拉 (L. Euler, 1707-1783)
&lt;/h3>&lt;p>瑞士诞生的数学之王。在几乎所有的数学领域都取得了成就。留下了700多篇论文和45部著作。&lt;/p>
&lt;h3 id="勒让德-a-m-legendre-1752-1833">勒让德 (A. M. Legendre, 1752-1833)
&lt;/h3>&lt;p>法国数学家。在整数论、椭圆积分、引力问题等领域留下了大量成就。“数论”一词源自他的主要著作《数论》。&lt;/p>
&lt;h3 id="库默尔-e-e-kummer-1810-1893">库默尔 (E. E. Kummer, 1810-1893)
&lt;/h3>&lt;p>德国数学家。将分圆体的整数论应用于费马大定理，取得了巨大成果。&lt;/p>
&lt;h3 id="笛卡尔-r-descartes-1596-1650">笛卡尔 (R. Descartes, 1596-1650)
&lt;/h3>&lt;p>法国极具独创性的哲学家。代表作有《方法论》、《几何学》、《宇宙论》等。&lt;/p>
&lt;h3 id="帕斯卡-b-pascal-1623-1662">帕斯卡 (B. Pascal, 1623-1662)
&lt;/h3>&lt;p>以研究概率论和流体闻名的法国哲学家。后来加入冉森派，从事宗教活动。《思想录》就是那个时期的著作。&lt;/p>
&lt;h3 id="巴谢-c-g-bachet-1581-1638">巴谢 (C. G. Bachet, 1581-1638)
&lt;/h3>&lt;p>法国贵族，以数字谜题为兴趣。出版了丢番图《算术》的拉丁文译本，并将其作为自己研究的注释刊登。&lt;/p>
&lt;h3 id="沃利斯-j-wallis-1616-1703">沃利斯 (J. Wallis, 1616-1703)
&lt;/h3>&lt;p>英国数学家。在主要著作《无穷算术》中赋予极限概念以数学形式，为微积分学奠定了基础。&lt;/p>
&lt;h3 id="布龙克尔-w-brouncker-1620-1684">布龙克尔 (W. Brouncker, 1620-1684)
&lt;/h3>&lt;p>爱尔兰贵族。皇家学会（英国科学院）首任会长。数学爱好者，与沃利斯等人有交往。&lt;/p>
&lt;h3 id="拉格朗日-j-l-lagrange-1736-1813">拉格朗日 (J. L. Lagrange, 1736-1813)
&lt;/h3>&lt;p>出生于意大利的法国数学家。继欧拉之后担任柏林科学院数学部主任。在整数论、分析力学等领域取得了巨大成就。&lt;/p>
&lt;h3 id="西格尔-c-l-siegel-1896-1981">西格尔 (C. L. Siegel, 1896-1981)
&lt;/h3>&lt;p>德国数论学家。在数的分析理论方面做出了诸多贡献。&lt;/p>
&lt;h3 id="斐波那契-l-fibonacci-1175左右-1250左右">斐波那契 (L. Fibonacci, 1175左右-1250左右)
&lt;/h3>&lt;p>意大利数学家。主要著作《算盘书》使用了印度-阿拉伯数字，致力于其普及。并在《平方书》中论述了同余数。&lt;/p>
&lt;h3 id="贝克-a-baker-1939-">贝克 (A. Baker, 1939-)
&lt;/h3>&lt;p>英国数论学家。因在超越数论方面的贡献，与广中平佑共同获得了菲尔兹奖。&lt;/p>
&lt;h3 id="庞加莱-j-poincare-1854-1912">庞加莱 (J. Poincare, 1854-1912)
&lt;/h3>&lt;p>被称为最后的全能数学家的法国数学家。不仅在自守函数论、非欧几何、微分方程、天体力学、电动力学等领域，在科学评论方面也留下了卓越的著作。&lt;/p>
&lt;h3 id="莫德尔-l-j-mordell-1888-1972">莫德尔 (L. J. Mordell, 1888-1972)
&lt;/h3>&lt;p>美国出生的数学家。父母是来自立陶宛的移民。在不定方程论方面有大量论文，其中椭圆曲线论中的莫德尔定理尤为著名。韦伊将其推广到一般代数曲线的情况，算术代数几何由此获得了爆炸性的发展。&lt;/p>
&lt;h3 id="韦伊-a-weil-1906-">韦伊 (A. Weil, 1906-)
&lt;/h3>&lt;p>犹太裔法国数学家。年轻时对费马问题产生兴趣，为了将其应用于数论，对代数几何学进行了根本性的重新审视，奠定了严格的基础。也以数学史著作而闻名。&lt;/p>
&lt;h3 id="梅森-m-mersenne-1588-1648">梅森 (M. Mersenne, 1588-1648)
&lt;/h3>&lt;p>法国最小兄弟会的教士。负责各地数学家的往来书信。“梅森数”这个名称的数，实际上是由费马想出的。&lt;/p>
&lt;h3 id="罗贝瓦尔-g-p-de-roberval-1602-1675">罗贝瓦尔 (G. P. de Roberval, 1602-1675)
&lt;/h3>&lt;p>法国数学家。当时作为数学家获得教授职位的几乎唯一一人，以研究摆线等而闻名。&lt;/p>
&lt;h3 id="阿贝尔-n-h-abel-1802-1829">阿贝尔 (N. H. Abel, 1802-1829)
&lt;/h3>&lt;p>挪威数学家。在一般五次方程的不可解性、椭圆函数论、阿贝尔积分论等方面取得了卓越成就，但英年早逝。&lt;/p>
&lt;h3 id="雅可比-k-g-jacob-1804-1851">雅可比 (K. G. Jacob, 1804-1851)
&lt;/h3>&lt;p>犹太裔德国数学家。在椭圆函数论、θ函数论、微分方程、变分学等领域留下了巨大成就。向世人介绍了阿贝尔的成就。以宣称科学的目的是为了“人类精神的荣誉”，并排斥实用主义而闻名。&lt;/p>
&lt;h3 id="高斯-c-f-gauss-1777-1855">高斯 (C. F. Gauss, 1777-1855)
&lt;/h3>&lt;p>德国诞生的数学王。以整数论、非欧几何、大地测量学、超几何级数、曲面论、地磁研究等闻名。是个完美主义者，据说除非完善到连脚手架都看不见的地步，否则不会公开成果。代表作为《算术研究》等。&lt;/p>
&lt;h3 id="拉梅-g-lame-1795-1870">拉梅 (G. Lame, 1795-1870)
&lt;/h3>&lt;p>法国数学家。对弹性力学、热传导论等有贡献。&lt;/p>
&lt;h3 id="刘维尔-j-liouville-1809-1882">刘维尔 (J. Liouville, 1809-1882)
&lt;/h3>&lt;p>法国数学家。对微分方程、超越整数论、函数论做出了贡献。&lt;/p>
&lt;h3 id="柯西-a-l-cauchy-1789-1857">柯西 (A. L. Cauchy, 1789-1857)
&lt;/h3>&lt;p>法国数学家。多产，在理论物理、数学方面成就卓著。据说在法国受到与高斯同等的尊敬。&lt;/p>
&lt;h3 id="伽罗瓦-e-galois-1811-1832">伽罗瓦 (E. Galois, 1811-1832)
&lt;/h3>&lt;p>法国数学家。引入了群的概念，阐明了阿贝尔定理：五次以上的方程一般不能用代数方法求解。年纪轻轻就在决斗中倒下，现在已知起因是因为无聊的女性问题。&lt;/p>
&lt;h3 id="亨泽尔-k-hensel-1861-1941">亨泽尔 (K. Hensel, 1861-1941)
&lt;/h3>&lt;p>德国数学家。克罗内克的弟子。应用函数论方法将 p 进数（p 进解析）理论引入数论。&lt;/p>
&lt;h3 id="哈塞-h-hasse-1898-1979">哈塞 (H. Hasse, 1898-1979)
&lt;/h3>&lt;p>德国数学家。亨泽尔的弟子，为p进分析的奠基及其应用做出了贡献。参与了类域论的整理、椭圆曲线L函数的研究等。&lt;/p>
&lt;h3 id="克罗内克-l-kronecker-1823-1891">克罗内克 (L. Kronecker, 1823-1891)
&lt;/h3>&lt;p>犹太裔德国数学家。对椭圆函数论、数论等有贡献。也因提倡数学的算术基础而闻名，但其主观性极强的性格，对柏林大学同事魏尔斯特拉斯进行无理的批评，妨碍康托尔就业等，给他的一生留下了负面印象。&lt;/p>
&lt;h3 id="希尔伯特-d-hilbert-1862-1943">希尔伯特 (D. Hilbert, 1862-1943)
&lt;/h3>&lt;p>德国数学家。在不变量理论、代数整数论、数学基础论等数学的各个领域留下了巨大的足迹。他在巴黎国际数学家大会(1900年)上提出的23个问题对数学的发展产生了巨大影响。&lt;/p>
&lt;h3 id="黎曼-b-riemann-1826-1866">黎曼 (B. Riemann, 1826-1866)
&lt;/h3>&lt;p>德国数学家。在复变函数论中提出黎曼面的概念、黎曼几何学等，取得了涉及数学根本的巨大成就。&lt;/p>
&lt;h3 id="法尔廷斯-g-faltings-1954-">法尔廷斯 (G. Faltings, 1954-)
&lt;/h3>&lt;p>德国数学家。于1983年解决了莫德尔猜想。&lt;/p>
&lt;h3 id="怀尔斯-a-wiles-1953-">怀尔斯 (A. Wiles, 1953-)
&lt;/h3>&lt;p>出生于英国的数学家。在岩泽主猜想、贝赫和斯维讷通-戴尔猜想（BSD猜想）等研究中做出了巨大贡献，是该领域的领军人物。&lt;/p>
&lt;h3 id="参考文献">参考文献
&lt;/h3>&lt;p>《费马大定理被证明了！从欧拉到怀尔斯的证明》讲谈社&lt;/p></description></item><item><title>【公式完全解析】经典最强“GNFS”为何败给量子算法？因数分解的范式转变</title><link>http://kenji.blog/zh-cn/p/gnfs-to-shors-algorithm-math-deepdive/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://kenji.blog/zh-cn/p/gnfs-to-shors-algorithm-math-deepdive/</guid><description>&lt;img src="http://kenji.blog/p/gnfs-to-shors-algorithm-math-deepdive/quantum_vs_gnfs_eyecatch_1788616101508.jpg" alt="Featured image of post 【公式完全解析】经典最强“GNFS”为何败给量子算法？因数分解的范式转变" />&lt;p>现代互联网社会中的信息安全，是由以RSA密码为首的公开密钥密码体制来保障的。RSA密码安全性的依据依赖于这样一个事实：&lt;strong>“对巨大的合数进行因数分解在计算上是极其困难的”&lt;/strong>。&lt;/p>
&lt;p>本文将为您剖析经典计算机中最强的因数分解算法——&lt;strong>“普通数域筛选法”&lt;/strong>（General Number Field Sieve, GNFS）的数学机制，并通过公式和概念图深入探讨它为何会被彼得·肖尔发现的 &lt;strong>“Shor算法”&lt;/strong> 彻底击败，揭示这场范式转变。&lt;/p>
&lt;hr>
&lt;h2 id="1-经典计算中的因数分解方法从费马因数分解法的发展">1. 经典计算中的因数分解方法：从费马因数分解法的发展
&lt;/h2>&lt;p>因数分解问题是指：对于给定的合数 $N$，找到素数 $p, q$ 使得 $N = p \times q$ 的问题。&lt;/p>
&lt;p>基本的思路归结为寻找满足以下同余式的非平凡的 $x, y$：&lt;/p>
$$ x^2 \equiv y^2 \pmod N $$
&lt;p>对其进行变形，得到：&lt;/p>
$$ x^2 - y^2 \equiv 0 \pmod N $$
$$ (x - y)(x + y) \equiv 0 \pmod N $$
&lt;p>在此，如果 $x \not\equiv \pm y \pmod N$，则通过计算 $\gcd(x-y, N)$ 或 $\gcd(x+y, N)$，就可以得到 $N$ 的非平凡因子。这一事实构成了包括GNFS在内的现代因数分解算法的基础。&lt;/p>
&lt;hr>
&lt;h2 id="2-经典最强算法普通数域筛选法gnfs的深渊">2. 经典最强算法：“普通数域筛选法”（GNFS）的深渊
&lt;/h2>&lt;p>&lt;strong>“GNFS”&lt;/strong> 是目前已知针对经典计算机的最快因数分解算法。其时间复杂度需要亚指数级（Sub-exponential）的时间。&lt;/p>
&lt;h3 id="gnfs的计算复杂度">GNFS的计算复杂度
&lt;/h3>&lt;p>设数字 $N$ 的位数为 $b = \log_2 N$，GNFS的计算复杂度可以表示为：&lt;/p>
$$ O\left( \exp \left( \left(\frac{64}{9} b\right)^{1/3} (\log b)^{2/3} \right) \right) $$
&lt;p>从这个公式可以看出，计算复杂度并不是多项式时间，而是比指数函数稍慢的 &lt;strong>“亚指数时间”&lt;/strong>。尽管如此，随着位数的增加，计算时间仍会呈天文数字般增长。&lt;/p>
&lt;h3 id="gnfs的数学机制">GNFS的数学机制
&lt;/h3>&lt;p>GNFS主要由四个步骤组成：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>多项式选择 (Polynomial Selection)&lt;/strong>&lt;/li>
&lt;li>&lt;strong>筛选 (Sieving)&lt;/strong>&lt;/li>
&lt;li>&lt;strong>矩阵化简 (Matrix Reduction)&lt;/strong>&lt;/li>
&lt;li>&lt;strong>平方根计算 (Square Root)&lt;/strong>&lt;/li>
&lt;/ol>
&lt;h4 id="21-多项式选择与代数数域">2.1. 多项式选择与代数数域
&lt;/h4>&lt;p>首先，选择以整数为系数的不可约多项式 $f(x)$ 和 $g(x)$。它们被设定为在模 $N$ 下具有公共根 $m$。即：&lt;/p>
$$ f(m) \equiv 0 \pmod N $$
$$ g(m) \equiv 0 \pmod N $$
&lt;p>通常，$g(x)$ 被选择为一次多项式 $g(x) = x - m$。设 $f(x)$ 的根为 $\alpha$，则构造出一个名为 $\mathbb{Q}(\alpha)$ 的 &lt;strong>“代数数域”&lt;/strong>（Number Field）。通过同态映射 $\phi: \alpha \mapsto m$，比较 $\mathbb{Q}(\alpha)$ 环中的运算与普通整数环 $\mathbb{Z}$ 中的运算。&lt;/p>
&lt;h4 id="22-筛选-sieving">2.2. 筛选 (Sieving)
&lt;/h4>&lt;p>接着，寻找大量互素的整数对 $(a, b)$。目的是找到满足以下两个值分别为 &lt;strong>“B-smooth”&lt;/strong>（仅由较小素因子组成）的整数对：&lt;/p>
&lt;ol>
&lt;li>$a - bm$ （整数环上的值）&lt;/li>
&lt;li>$b^d f(a/b)$ （对应代数数域上的范数 $N(a - b\alpha)$）&lt;/li>
&lt;/ol>
&lt;p>在这里采用被称为 &lt;strong>“筛选”&lt;/strong>（Sieve）的高效搜索方法。这使得我们能够从庞大的候选集中高效提取满足条件的 $(a, b)$ 对。&lt;/p>
&lt;h4 id="23-矩阵化简-linear-algebra-over-gf2">2.3. 矩阵化简 (Linear Algebra over GF(2))
&lt;/h4>&lt;p>由收集到的整数对 $(a, b)$ 构造指数向量，并在 $\mathbb{F}_2$ （仅包含0和1的域）上求解巨大稀疏矩阵的左零空间。&lt;/p>
&lt;p>找到向量 $v$ 作为解，使得关系式 $ \prod (a_i - b_i m) $ 和 $ \prod (a_i - b_i \alpha) $ 都成为平方元。这无异于求解如下线性方程组：&lt;/p>
$$ M \mathbf{x} \equiv \mathbf{0} \pmod 2 $$
&lt;p>在这里，使用了如分块Lanczos法（Block Lanczos Algorithm）和分块Wiedemann法（Block Wiedemann Algorithm）等高级数值计算算法。&lt;/p>
&lt;h4 id="24-平方根计算">2.4. 平方根计算
&lt;/h4>&lt;p>最后，在代数数域和整数环上同时取平方根，导出 $x^2 \equiv y^2 \pmod N$ 的关系式。然后计算 $\gcd(x-y, N)$ 从而得到因子。&lt;/p>
&lt;hr>
&lt;h2 id="3-量子计算的突破shor算法">3. 量子计算的突破：“Shor算法”
&lt;/h2>&lt;p>相较于GNFS需要亚指数级时间，彼得·肖尔在1994年发表的 &lt;strong>“Shor算法”&lt;/strong>，利用量子计算机可以在 &lt;strong>“多项式时间”&lt;/strong> 内解决这一问题。&lt;/p>
&lt;h3 id="shor算法的计算复杂度">Shor算法的计算复杂度
&lt;/h3>&lt;p>假设量子比特数为 $O(\log N)$，时间复杂度如下：&lt;/p>
$$ O((\log N)^3) $$
&lt;p>这意味着它不会随比特数产生指数级的爆炸。即使是那些对于 &lt;strong>“经典计算”&lt;/strong> 而言计算量超过宇宙寿命的巨大合数，在 &lt;strong>“量子计算”&lt;/strong> 下也能在几小时到几天内破解，这是一个惊人的结果。&lt;/p>
&lt;h3 id="shor算法全貌归结为寻找周期问题">Shor算法全貌：归结为寻找周期问题
&lt;/h3>&lt;p>Shor算法巧妙地将因数分解问题归结为 &lt;strong>“寻找周期问题”&lt;/strong>。&lt;/p>
&lt;ol>
&lt;li>选取与 $N$ 互素的随机整数 $a$（$1 &lt; a &lt; N$）。&lt;/li>
&lt;li>定义函数 $f(x) = a^x \bmod N$。&lt;/li>
&lt;li>找到 $f(x)$ 的周期 $r$，即满足 $a^r \equiv 1 \pmod N$ 的最小正整数 $r$。&lt;/li>
&lt;li>如果 $r$ 为偶数，则检查 $a^{r/2} \not\equiv -1 \pmod N$ 是否成立，计算 $\gcd(a^{r/2} \pm 1, N)$ 以获得素因子。&lt;/li>
&lt;/ol>
&lt;p>这个步骤3中 &lt;strong>“周期的寻找 $r$”&lt;/strong> 正是经典计算机需要指数级时间的瓶颈，但量子计算机利用 &lt;strong>“量子叠加”&lt;/strong> 和 &lt;strong>“量子傅里叶变换”&lt;/strong>（QFT），可以瞬间解决这个问题。&lt;/p>
&lt;hr>
&lt;h2 id="4-量子傅里叶变换qft与周期提取">4. 量子傅里叶变换（QFT）与周期提取
&lt;/h2>&lt;p>让我们用公式详细看看Shor算法的核心——量子状态的操作。&lt;/p>
&lt;h3 id="41-量子叠加的生成">4.1. 量子叠加的生成
&lt;/h3>&lt;p>首先，准备两个量子寄存器。寄存器1保持输入 $x$ 的叠加态，寄存器2保持函数的计算结果 $f(x)$。对初始状态 $|0\rangle |0\rangle$ 应用阿达马变换（Hadamard Transform），创造出所有可能 $x$ 的叠加。&lt;/p>
$$ |\psi_1\rangle = \frac{1}{\sqrt{Q}} \sum_{x=0}^{Q-1} |x\rangle |0\rangle $$
&lt;p>
（其中 $Q$ 是满足 $N^2 \le Q &lt; 2N^2$ 的2的幂）&lt;/p>
&lt;p>接着，利用量子预言机 $U_f$ 计算 $f(x) = a^x \bmod N$ 并存入寄存器2。&lt;/p>
$$ |\psi_2\rangle = U_f |\psi_1\rangle = \frac{1}{\sqrt{Q}} \sum_{x=0}^{Q-1} |x\rangle |a^x \bmod N\rangle $$
&lt;p>假设现在测量了寄存器2（实际上即使不测量，数学结构也是相同的）。如果观测到某个值 $y = a^{x_0} \bmod N$，寄存器1的状态就会坍缩到所有使 $f(x) = y$ 成立的 $x$ 的叠加。设周期为 $r$，那么这样的 $x$ 将是 $x_0, x_0 + r, x_0 + 2r, \dots$。&lt;/p>
$$ |\psi_3\rangle = \frac{1}{\sqrt{M}} \sum_{k=0}^{M-1} |x_0 + kr\rangle $$
&lt;p>
（其中 $M \approx Q/r$ 是项数）&lt;/p>
&lt;p>这个状态内含了周期 $r$ 的信息，但直接测量只能得到随机的 $x_0 + kr$，无法得知周期 $r$。这时QFT便派上用场了。&lt;/p>
&lt;h3 id="42-应用量子傅里叶变换-quantum-fourier-transform">4.2. 应用量子傅里叶变换 (Quantum Fourier Transform)
&lt;/h3>&lt;p>QFT是对量子状态的振幅进行离散傅里叶变换的操作。QFT对状态 $|x\rangle$ 的作用定义如下：&lt;/p>
$$ \text{QFT} |x\rangle = \frac{1}{\sqrt{Q}} \sum_{y=0}^{Q-1} e^{2\pi i \frac{xy}{Q}} |y\rangle $$
&lt;p>将此应用于 $|\psi_3\rangle$，会发生相位干涉（量子干涉）。&lt;/p>
$$ |\psi_4\rangle = \text{QFT} |\psi_3\rangle = \frac{1}{\sqrt{MQ}} \sum_{y=0}^{Q-1} \sum_{k=0}^{M-1} e^{2\pi i \frac{(x_0 + kr)y}{Q}} |y\rangle $$
&lt;p>展开此式的和：&lt;/p>
$$ \sum_{k=0}^{M-1} e^{2\pi i \frac{kry}{Q}} $$
&lt;p>这部分便显现出来。这个等比数列的和，只有当 $ry/Q$ 接近整数时才会增强（Constructive Interference），在其他情况下则会相互抵消（Destructive Interference）。&lt;/p>
&lt;p>因此，以高概率被测量到的状态 $|y\rangle$ 将是满足以下条件的整数 $y$：&lt;/p>
$$ \frac{y}{Q} \approx \frac{c}{r} $$
&lt;p>
（$c$ 为某个整数）&lt;/p>
&lt;h3 id="43-通过连分数展开确定周期">4.3. 通过连分数展开确定周期
&lt;/h3>&lt;p>通过测量得到 $y$ 后，使用经典计算机对 $y/Q$ 进行 &lt;strong>“连分数展开”&lt;/strong>（Continued Fraction Expansion）。由此计算出 $y/Q$ 的近似分数 $c/r$，从而可以高效地从分母中提取出周期 $r$ 的候选值。&lt;/p>
&lt;hr>
&lt;h2 id="5-概念模型比较与范式转变">5. 概念模型比较与范式转变
&lt;/h2>&lt;p>为了直观理解GNFS和Shor算法的区别，下面展示使用Mermaid语法的概念图。&lt;/p>
&lt;h3 id="基于量子电路的shor算法概念图">基于量子电路的Shor算法概念图
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">graph TD
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> A[初始状态: 0...0] --&amp;gt; B[阿达马变换实现全状态叠加]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> B --&amp;gt; C[模幂运算 a^x mod N]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> C --&amp;gt;|量子纠缠| D[坍缩到具有周期性的状态]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> D --&amp;gt; E[量子傅里叶变换 QFT]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> E --&amp;gt;|干涉概率放大| F[测量: 得到y]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> F --&amp;gt; G[经典处理: 连分数展开]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> G --&amp;gt; H[找到周期 r]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> H --&amp;gt; I[算出N的素因子]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> style A fill:#f9f,stroke:#333,stroke-width:2px
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> style E fill:#bbf,stroke:#333,stroke-width:2px
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> style I fill:#bfb,stroke:#333,stroke-width:2px
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="范式转变的本质">范式转变的本质
&lt;/h3>&lt;p>GNFS采取了 &lt;strong>“在数学空间（代数数域）中寻找关系式”&lt;/strong> 的方法。然而，搜索空间随位数呈指数级扩展，因此在经典计算机的计算能力（即使包含并行化）下，当密钥长度超过2048位等时，实际上是无法解密的。&lt;/p>
&lt;p>另一方面，Shor算法利用了 &lt;strong>“量子干涉的波特性”&lt;/strong>。同时评估处于叠加态的所有计算路径，通过QFT抵消（减弱）不需要的答案，仅放大（增强）作为正确答案的周期概率振幅。由此实现了非遍历空间，而是 &lt;strong>“让正确答案浮现”&lt;/strong> 的完全不同维度的途径。&lt;/p>
&lt;h2 id="6-总结">6. 总结
&lt;/h2>&lt;p>本文深入比较了经典极限巅峰的 &lt;strong>“GNFS”&lt;/strong> 和展现量子计算力量的 &lt;strong>“Shor算法”&lt;/strong>，探讨了各自的数学背景和算法结构。&lt;/p>
&lt;p>相较于GNFS倾尽多项式选择或巨大矩阵计算等数学技巧将计算复杂度降至亚指数时间，Shor算法将量子力学的基本原理——叠加与干涉与数学工具（QFT）融合，一举实现了向多项式时间的突破。&lt;/p>
&lt;p>目前，能够以实用规模（数千个量子比特）运行Shor算法的容错量子计算机（FTQC）尚不存在。然而，正是这种数学与理论范式转变的存在，构成了当今世界急切向抗量子密码（PQC: Post-Quantum Cryptography）过渡的最大理由。&lt;/p></description></item></channel></rss>