1、前言
杨辉三角很早学编程就知道,但不知道杨辉是古人!
一次偶然的机会,和杨辉三角对上了眼神——杨辉!究竟你是怎么发现杨辉三角的呢?
于是经过了长达3个月锲而不舍的探究。
终究也没发现自己想要的最终结果。
不过也还有有一点点小的收获——今闻三角。
我满怀信心的以为自己发现了一片奥区和大家分享,却没想给数学吧封贴了。
所以才想起在知乎来。果然非常贴心,居然自动邀请我写一下感想。
本来我都是没有任何重写的激情和信心,不过既然它这么盛情,我就再试一番吧。
2、今闻三角的规则
问题是围绕杨辉三角的由来而展开。
所以把杨辉三角进行两个处理:
1、有生于无。
2、数生于0,值极于九。
第一条,则用0开始生成杨辉三角,其实后来发现许多人都是这样处理的。
第二条,使用模运算,使得杨辉三角的最大数为9。
其他和杨辉三角完全一致。
按照这个想法在excel上一列,居然发现有点和自己想象的意外,却发现是自己计算错了。
于是就干脆写代码来生成。
这一来,果然一发不可收拾。
3、今闻三角的0聚现象
当时花费这么多心里的关键是今闻三角的一个奇特现象——0聚合。
就是整个今闻三角出现了成片的三角0。
当时以为有规矩可循,结果唯一找到的就是物极必反——由盛及衰!
4、各种进制的奇特差异
当时忽然萌生一个想法,转换为二进制会是如何?
于是,就逐一尝试,甚至最后搞到最大25进制。
由此才发现杨辉三角和素数的一些关联,于是又转头去啃素数。
二进制,太规则了
三进制,像一个三叶风轮
四进制,花了许多,却是规则分形
五进制,出奇的规则
六进制,出奇的凌乱,却和十进制相似
七进制,又很听话,让人想起了素数
八进制,似乎是四进制的扩展
九进制,虚虚实实,非常美
就这么一眼瞅上去,有几个明显的结论:
第一:所有进制的0三角聚合,大体是三个角虚,中间实,实现分形效果。
第二:六进制和十进制比较特殊,当数据达到1W,也没出现分形!
第三:素数的图形格外奇特,就是从1个一直排到N-1个。
5、素数和杨辉
对于素数进制的今闻三角图谱,这种最直观的猜测确实是对的。
后来经过对照杨辉三角的通项公式,发现确实如此
——素数纬今闻三角的底边除了两头为1,全是0!
而其前一行,竟然全是1!
本以为这个用来检测素数很快,结果算法复杂度依旧。
不过另外一个特殊现象却似乎很管用,就是素数纬的今闻三角其第二斜边可定不为0!
果然,用这个方法求取1亿的素数快了很多。
后来想突破一下大数据,因为用java的big类型,对象构造很慢,发现效果很不理想,只好作罢。
接着还是不甘心,开始又一个漫长而又艰难的探索。
6、中数通项公式
以前编程只是写出10以内的杨辉三角,而且后面数据很大,所以不甚在意。
这次通过今闻三角的简化,和有了探索的动力,最大把数据调到2W!
以前数学家绞尽脑汁个把月时间才能算出来的,程序几秒钟就把所有数据完全呈现!
这个最笨的办法,如今似乎却是最有效的了。
经过这一番周折,决定走一条捷径,又回到杨辉三角,看它和素数的关联何在。
我的目标是盯在了一个我自己起的叫中数的地方!
首先发现了杨辉三角隐藏的一个特性——均衡性。
就是把杨辉三角折叠,发现其重叠两数乘积的和居然是一个固定值——中数!
哈哈,这个也是太无望的时候,想起了高斯大人的妙法。
中数
特别的,对折线的数的平方和就是该中数!
在我的预感中,该中数就是整个杨辉三角的灵魂和缩影!
所以素数纬的杨辉三角的中数必然和该素数有着奇特的关系。
在漫无涯际的苦苦求索中,亦然无果,没有找到中数的通项公式!
想到的所有算法其复杂度都一样,还真省不过去。
不过有几个发现也算是比较欣慰。
这个似乎是目前杨辉三角最全的公式
这个是杨辉三角相邻两列的比值
这个是杨辉三角相邻两行的比值
7、素数判定
奇怪,为何没有求余运算符?
打不动了,偷个懒吧,网上发现素数的定义是用威尔逊的定理来的。
用中数判断素数的方法很简单,代码就几句话,但是中数计算却是麻烦,大数据也很慢,就不贴代码了。
这个就是杨辉三角判断素数的法则
当时好像自己证明过,但是找不到了。
8、素数间隔
为了这个素数还真煞费苦心,来去折腾还真是没有通项公式。
所以自己就提出了个两仪体系的概念来安慰自己。
不过也是发现一个奇特的现象,就是两个相邻素数,之间隔6的概率最大。
而且其6倍的概率也远远高出其他值。
似乎隐隐约约觉得这个分布和杨辉三角有关系。
素数间隔6倍法则
这个是1亿的数据,我的电脑太旧,撑不到2亿的运算,1亿多的没记结果看走向也是如此。
9、异想天开
当时自己的感觉是找到了打通东西方文化的桥梁,所以着实飘了一阵子。
杨辉三角从西方的视角是被世人所承认,这个必须承认,因为人家帕斯卡都这么认为的。
但是从东方的视觉,似乎人们从未去思考过为什么。
我一直认为,就如同数学上一次一次的扩展,从整数到小数,从有理数到无理数,从实数到虚数……
这个路肯定没有到终点,西方的数理逻辑或许只是一个目前很高光的分支,
而它的另一支,却在至暗的历史长河里淹没着——这个就是东方数理逻辑。
或许杨辉三角就是一个窗口。
下面是html杨辉三角:
<!DOCTYPE html>
<html>
<head>
<title>杨辉三角</title>
<style>
table {
margin: auto;
border-collapse: collapse;
}
table td {
width: 30px;
height: 30px;
text-align: center;
border: 1px solid black;
}
</style>
</head>
<body>
<script>
function generateTriangle(rows) {
var triangle = [];
for (var i = 0; i < rows; i++) {
triangle[i] = [];
for (var j = 0; j <= i; j++) {
if (j === 0 || j === i) {
triangle[i][j] = 1;
} else {
triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j];
}
}
}
return triangle;
}
function displayTriangle(triangle) {
var table = document.createElement('table');
for (var i = 0; i < triangle.length; i++) {
var row = document.createElement('tr');
for (var j = 0; j < triangle[i].length; j++) {
var cell = document.createElement('td');
cell.innerText = triangle[i][j];
row.appendChild(cell);
}
table.appendChild(row);
}
document.body.appendChild(table);
}
var rows = 10; // 指定要生成的行数
var triangle = generateTriangle(rows);
displayTriangle(triangle);
</script>
</body>
</html>
这是c++的杨辉三角:
#include <iostream>
#include <vector>
std::vector<std::vector<int>> generateTriangle(int numRows) {
std::vector<std::vector<int>> triangle;
for (int i = 0; i < numRows; i++) {
std::vector<int> row(i + 1, 1);
for (int j = 1; j < i; j++) {
row[j] = triangle[i - 1][j - 1] + triangle[i - 1][j];
}
triangle.push_back(row);
}
return triangle;
}
void displayTriangle(const std::vector<std::vector<int>>& triangle) {
int numRows = triangle.size();
for (int i = 0; i < numRows; i++) {
int numCols = triangle[i].size();
for (int j = 0; j < numCols; j++) {
std::cout << triangle[i][j] << " ";
}
std::cout << std::endl;
}
}
int main() {
int numRows = 10; // 指定要生成的行数
std::vector<std::vector<int>> triangle = generateTriangle(numRows);
displayTriangle(triangle);
return 0;
}
Python杨辉三角:
def yanghui_triangle(n):
triangle = [[1] * (i+1) for i in range(n)]
for i in range(2, n):
for j in range(1, i):
triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j]
return triangle
def print_triangle(triangle):
for row in triangle:
print(" ".join(map(str, row)))
n = int(input("请输入行数:"))
triangle = yanghui_triangle(n)
print_triangle(triangle)
请大家点赞关注收藏,成为粉丝3月30日有福利!