多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

087整数分划生成

087整数分划生成 整数分划生成Integer Partition- 将整数拆分为所有可能的加法087整数划分从欧拉到高德纳 5W1H 发明者故事Who何人- 发明者是谁数学奠基者莱昂哈德·欧拉Leonhard Euler1707-1783瑞士数学家历史上最多产的数学家之一。欧拉在1748年的著作《无穷分析引论》Introductio in Analysin Infinitorum中引入了分拆Partition的概念并发现了欧拉恒等式和五边形数定理建立了整数分划的生成函数理论。现代算法设计者唐纳德·克努斯Donald E. Knuth在TAOCP第4卷Fascicle 3第7.2.1.4节中给出了Algorithm P迭代生成整数分划的完整描述和分析。当时的处境欧拉在研究数论的过程中偶然发现了分拆函数的神奇性质。一个整数n可以以多少种方式写成正整数之和欧拉发现这个问题与素数分布、模形式Modular Forms和椭圆曲线有深刻联系这些联系直到20世纪才被完全理解拉马努金、哈代等人的工作。When何时- 什么时候发明的时间线1748年欧拉在《无穷分析引论》中引入分拆函数 p(n) 和生成函数1919年斯里尼瓦萨·拉马努金Ramanujan和高弗雷·哈代Hardy发现 p(n) 的精确渐近公式圆法Circle Method1937年拉德马赫Hans Rademacher给出了 p(n) 的精确收敛级数1970年代Knuth开始系统化整理整数分划的生成算法2005年TAOCP Vol4 Fascicle 3正式出版Algorithm P完整呈现重要数据p(10)42p(100)190,569,292p(200)3,972,999,029,388增长极快Where何地- 在哪里发明的欧拉的地点圣彼得堡俄罗斯彼时的俄国帝国。欧拉在圣彼得堡科学院度过了生命中最重要的研究时期1727-17411766-1783在那里完成了包括整数分划理论在内的大量数学工作。他右眼在圣彼得堡失明后来左眼也失明但依然凭借惊人的心算能力继续研究。拉马努金的贡献1914年拉马努金从印度前往剑桥大学与哈代合作在极短的时间内对分拆函数做出了里程碑式的贡献留下了许多至今未被完全证明的公式。What何事- 发明了什么算法整数分划生成Integer Partition Generation数学定义整数n的分划是将n表示为一组正整数之和的方案不计顺序整数4的所有5种分划4 4 4 3 1 4 2 2 4 2 1 1 4 1 1 1 1Knuth Algorithm P迭代生成维护数组a[1..m]满足a[1] a[2] ... a[m] 1和为n。P1. 初始化a[1] nm 1 P2. 访问当前分划 a[1], ..., a[m] P3. 若 a[m] 1 令 q m-1若a[m-1]2则特殊处理 找最后一个 1 的元素 否则令 q m将 a[q] 减1添加余量 P4. 生成下一个分划拆分函数 p(n) 的增长p(1)1, p(2)2, p(3)3, p(4)5, p(5)7, p(6)11, p(7)15, p(8)22, p(9)30, p(10)42Why何因- 为什么发明纯数学意义分拆函数与数论中最深刻的问题相连模形式Modular Forms和黎曼猜想五边形数定理p(n) p(n-1) p(n-2) - p(n-5) - p(n-7) ...欧拉发现拉马努金的模运算性质p(5k4) ≡ 0 (mod 5)令人惊叹的同余关系计算机科学应用多处理器调度将任务分配给处理器的方案数内存分配将内存块分配的所有方案密码学某些基于分划的密码系统组合游戏Nim等博弈的分析物理学量子场论中的费曼图计数How何果- 如何实现有什么影响算法特性Algorithm P原地O(n)空间生成所有p(n)个分划递归生成法直观易理解适合小n每个分划按降序最大部分在前生成历史影响欧拉五边形数定理开启了自动定理证明WZ方法的先河拉马努金的分拆公式是解析数论的里程碑分拆理论与弦理论、量子引力中的态密度计算有深刻联系Knuth Algorithm P成为计算机科学中枚举整数分划的标准方法 自然语言需求定义需求名称实现整数分划的递归生成和迭代生成Algorithm P核心概念整数分划Integer Partition将n表示为正整数之和不计加法顺序分划函数 p(n)n的分划数目如p(4)5p(5)7降序规范形式每个分划的各部分按降序排列如 321 而非 123功能需求partition_recursive(n, max_part)递归生成n的所有分划max_part限制最大部分partition_iterative(n)迭代Algorithm P生成所有分划Knuth方法partition_count(n)计算分划数 p(n)动态规划print_partition(arr, len)打印单个分划如31格式验收标准编号测试场景预期结果验证方式1partition(4)5种431222111111枚举验证2partition(5)7种分划计数验证3partition(1)1种仅{1}边界测试4两种方法结果一致递归迭代结果数量相同5每个分划各部分之和等于nsumn逐一验证6每个分划各部分降序排列a[i]a[i1]排序验证 C语言实现文件对应文件:integer_partition.c编译运行:gcc-stdc99-Wall-ointeger_partition_test integer_partition.c ./integer_partition_test核心函数:partition_recursive(n, max_part, buf, depth, results)- 递归生成partition_iterative(n, results, max_results)- 迭代Algorithm Ppartition_count(n)- 动态规划计算p(n) AI生成提示实现C99标准的整数分划生成算法参考Euler 1748年和 Knuth TAOCP Vol4 Fascicle 3 7.2.1.4节Algorithm P包含 1. 递归生成法带max_part限制自然产生降序 2. 迭代Algorithm PKnuth方法维护降序数组 3. 动态规划计算分划数p(n) 要求C99标准gcc -Wall无警告测试框架使用test_passed_msg/test_failed_msg/test_summary格式。
返回列表