Long Luo's Life Notes

每一天都是奇迹

By Long Luo

相信大家或多或少都听过六西格玛( \(\text{6 Sigma}\) ) 1 这个词,六西格玛是指生产的产品中, \(99.99966\%\) 的产品是没有质量问题的,即只有 \(3.4ppm\) 的不良率。

假如一家工厂生产某型号零件,零件的长度要求是 \(100mm\) ,允许的标准差是 \(0.1mm\) 。根据 \(6 \sigma\) 原则,零件规格允许的偏差范围是: \(100 \pm 6 \times 0.1 = 100 \pm 0.6\)

这意味着,零件长度超过 \(100.6mm\) 或低于 \(99.4mm\) 的概率是非常低的,约为 \(0.00034\%\) 。如果工厂每天生产 100 万个零件,只允许有 \(3.4\) 个零件会超出 \(6 \sigma\) 的范围,几乎可以忽略不计。因此,生产过程是极其稳定和可靠的,达到了六西格玛水平。

那么 \(6 \sigma\)\(3.4ppm\) 的不良率来自哪里呢?

学过中学数学都知道,在正态分布( \(\text{Normal Distribution}\) ) 2 中, \(68.27\%\) 的数据位于平均值的一个标准差内, \(95.45\%\) 位于两个标准差内, \(99.73\%\) 位于三个标准差内,这也是著名的 68-95-99.7 Rule 3 ,如下图 1 所示:

图1. 68-95-99.7 Rule

什么是正态分布?

数据可以用不同的方式“分布”,比如数据可以向左散布的多一些,也可以向右散布的多一些,或者分布的乱七八糟,如下图 2 - 4 所示,

图2. 数据偏向左散布
图3. 数据偏向右散布
图4. 数据随机分布

但数据经常会集中在一个中心值的附近,而不向左或右偏斜,像一个钟形,如下图 5 所示。

图5. 数据正态分布

正态分布,又称高斯分布( \(\text{Gaussian Distribution}\) ),是一种重要的概率分布,数学王子高斯 4 在正态分布的研究和应用上做出了巨大贡献。有很多日常现象都符合这种分布,如人的身高、考试成绩等。正因为它几乎无处不在,所以叫 \(\text{Normal Distribution}\) 。德国曾经发行的一款 10 马克的纸币上就印着高斯和正态分布曲线,如下图 6 所示。

图6. 高斯和正态分布曲线
阅读全文 »

By Long Luo

世界那么大,我想去看看!随着科技的发展,我们早已做到无需离开家就能领略世界各地的风景和文化。通过高清视频、高清直播、社交媒体、 VR 技术、各种图片或者视频分享平台,我们不仅可以体验世界名胜古迹、自然美景和各地的风土人情,还能与当地居民互动,了解他们的日常生活和传统文化。互联网丰富了人们的生活,缩小了地域的界限,真正实现了让世界触手可及,足不出户便可周游世界的梦想。但正所谓“百闻不如一见”,“读万卷书,不如行万里路!”,尽管互联网让我们可以虚拟游览世界,但亲自出行的体验无可替代。自由行不仅提供了前所未有的自由和灵活性,还能让我们亲身感受到大自然的美妙、城市的活力。这种身临其境的体验,远非屏幕前的感受可比。

当你打开地图软件时,你会看到如图 1 所示的道路标志,

图1. 道路编号

当你在道路出行时,你也会看到看到如下图 2 所示的路牌,但你可能并未真正留意过这些标志。因为现在我们只需要有一部联网的智能手机,在地图类软件里,设定出发地和目的地,自然有导航会指引我们到达目的地。

图2. G35 高速萝岗路段

这些编号肯定不是随机的,那么这些道路编号到底有什么用呢?出于好奇心你可能会去寻找答案,你很容易轻松找到 中国国家高速的编号密码 1 和 高速公路是怎样命名和编号 2 这样的文章。但这些文章只是告诉我们是什么,并没有告诉我们为什么。

国内现行的高速公路命名是由交通部从 2005 年启动的 3 ,之前道路都以起始地和终点地命名。你可能会想,之前那种命名方式不是更合理吗?用了数字不是更加不清晰易懂吗?如果图 1 不是路牌上写了济广高速,谁知道 G35 4 是哪里到哪里呢?

如果你更进一步的话,如果你去了解世界其他国家的高速公路命名的话,你会惊讶的地发现为什么居然全世界各主要大国都选择了类似的编号系统,这背后的原因是什么呢?

要回答这个问题,我们需要把时钟拨回几十年前,回到高速公路诞生的时期,那个没有 GPS ,没有手机,只有纸质地图的时代,我们才能知道这种编号系统的重要意义实用性,以及背后的数学密码

世界各国如何对高速公路进行编号?

我们已经了解了国内高速公路编号 5 ,让我们看看其他国家的高速公路系统编号是什么样的。这些国家需要国土面积足够大,高速公路系统足够发达,国土疆域长宽比例没有太夸张,人口分布比较均匀。

阅读全文 »

By Long Luo

阿里巴巴达摩院 从 2018 年开始每年都会举办一届全球数学竞赛,之前一方面自己数学水平比较弱,另外一方面也没有报名,但一直很仰慕那些数学大神的风采。今年是第一次报名参加 2024阿里巴巴全球数学竞赛 ,上周末参加了预选赛,但遗憾的是,全部 \(7\) 道题中只有第 \(1, 2, 6\) 题会做,这里分享下我的解答:

Problem 1

几位同学假期组成一个小组去某市旅游. 该市有 \(6\) 座塔,它们的位置分别为 \(A, B, C, D, E, F\) 。同学们自由行动一段时间后,每位同学都发现,自己在所在的位置只能看到位于 \(A, B, C, D\) 处的四座塔,而看不到位于 \(E\)\(F\) 的塔。已知:

  1. 同学们的位置和塔的位置均视为同一平面上的点,且这些点彼此不重合;
  2. 塔中任意 \(3\) 点不共线;
  3. 看不到塔的唯一可能就是视线被其它的塔所阻挡,例如,如果某位同学所在的位置 \(P\)\(A, B\) 共线,且 \(A\) 在线段 \(PB\) 上,那么该同学就看不到位于 \(B\) 处的塔。

(5 分) 请问 这个旅游小组最多可能有多少名同学?

\(A. \ 3 \qquad B. \ 4 \qquad C. \ 6 \qquad D. \ 12\)

Solution

这道题选 \(C\) ,最多只能有 \(6\) 名同学。

这道题的解题思路是从假设只有 \(1\) 座塔开始,一直到 \(6\) 座塔,找到思路。

  1. 假设有 \(1\) 座塔 \(A\) ,那么很显然有无数多同学可以看到塔 \(A\) ,也可以有无数多同学看不到塔 \(A\)​ ;

  2. 假设有 \(2\) 座塔 \(A, B\) ,那么只有以 \(A\) 为起点的射线 \(AB\) 且位于 \(B\) 之后的同学无法看到塔 \(A\)

  3. 假设有 \(3\) 座塔 \(A, B, C\) ,同理可知存在无数位同学至少可以看见 \(2\) 座塔;

  4. 假设有 \(4\) 座塔 \(A, B, C, D\) ,同理可知存在无数位同学至少可以看见 \(2\) 座塔;

  5. 假设有 \(6\) 座塔 \(A, B, C, D, E, F\) ,如果每位同学都无法看见 \(E, F\) 塔,如下图1 所示:

图1. Solution of Problem 1

所以至多有 \(6\) 位同学位于 \(M, N, O, P, R, Q\) 处,无法看到塔 \(E, F\)

阅读全文 »

By Long Luo

挖坑!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* Returns the trigonometric sine of an angle. Special cases:
* <ul><li>If the argument is NaN or an infinity, then the
* result is NaN.
* <li>If the argument is zero, then the result is a zero with the
* same sign as the argument.</ul>
*
* <p>The computed result must be within 1 ulp of the exact result.
* Results must be semi-monotonic.
*
* @param a an angle, in radians.
* @return the sine of the argument.
*/
@HotSpotIntrinsicCandidate
public static double sin(double a) {
return StrictMath.sin(a); // default impl. delegates to StrictMath
}
1
2
3
4
5
6
7
8
9
10
11
/**
* Returns the trigonometric sine of an angle. Special cases:
* <ul><li>If the argument is NaN or an infinity, then the
* result is NaN.
* <li>If the argument is zero, then the result is a zero with the
* same sign as the argument.</ul>
*
* @param a an angle, in radians.
* @return the sine of the argument.
*/
public static native double sin(double a);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/* @(#)k_sin.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/

/* __kernel_sin( x, y, iy)
* kernel sin function on [-pi/4, pi/4], pi/4 ~ 0.7854
* Input x is assumed to be bounded by ~pi/4 in magnitude.
* Input y is the tail of x.
* Input iy indicates whether y is 0. (if iy=0, y assume to be 0).
*
* Algorithm
* 1. Since sin(-x) = -sin(x), we need only to consider positive x.
* 2. if x < 2^-27 (hx<0x3e400000 0), return x with inexact if x!=0.
* 3. sin(x) is approximated by a polynomial of degree 13 on
* [0,pi/4]
* 3 13
* sin(x) ~ x + S1*x + ... + S6*x
* where
*
* |sin(x) 2 4 6 8 10 12 | -58
* |----- - (1+S1*x +S2*x +S3*x +S4*x +S5*x +S6*x )| <= 2
* | x |
*
* 4. sin(x+y) = sin(x) + sin'(x')*y
* ~ sin(x) + (1-x*x/2)*y
* For better accuracy, let
* 3 2 2 2 2
* r = x *(S2+x *(S3+x *(S4+x *(S5+x *S6))))
* then 3 2
* sin(x) = x + (S1*x + (x *(r-y/2)+y))
*/

#ifndef __FDLIBM_H__
#include "fdlibm.h"
#endif

double __kernel_sin(double x, double y, int iy)
{
double z, r, v;
int32_t ix;

static const double half = 5.00000000000000000000e-01; /* 0x3FE00000, 0x00000000 */
static const double S1 = -1.66666666666666324348e-01; /* 0xBFC55555, 0x55555549 */
static const double S2 = 8.33333333332248946124e-03; /* 0x3F811111, 0x1110F8A6 */
static const double S3 = -1.98412698298579493134e-04; /* 0xBF2A01A0, 0x19C161D5 */
static const double S4 = 2.75573137070700676789e-06; /* 0x3EC71DE3, 0x57B1FE7D */
static const double S5 = -2.50507602534068634195e-08; /* 0xBE5AE5E6, 0x8A2B9CEB */
static const double S6 = 1.58969099521155010221e-10; /* 0x3DE5D93A, 0x5ACFD57C */

GET_HIGH_WORD(ix, x);
ix &= IC(0x7fffffff); /* high word of x */
if (ix < IC(0x3e400000)) /* |x| < 2**-27 */
{
if ((int32_t) x == 0)
return x; /* generate inexact */
}
z = x * x;
v = z * x;
r = S2 + z * (S3 + z * (S4 + z * (S5 + z * S6)));
if (iy == 0)
return x + v * (S1 + z * r);
else
return x - ((z * (half * y - v * r) - y) - v * S1);
}

\[ \sin (x_0 + \Delta x) \approx \sin (x_0) + \sin'(x_0) \frac {\Delta x}{1!} + \sin''(x_0) \frac { \Delta x^2}{2!} + \sin'''(x_0) \frac {\Delta x^3}{3!} + \cdots \]

参考文献

  1. C mathematical functions
  2. Sine and cosine
0%