爱吱声

标题: 小小的停留之四 幸运数 [打印本页]

作者: 到处停留的叶子    时间: 2014-7-16 11:30
标题: 小小的停留之四 幸运数
上次说到  小小的停留之三 “计算机之父” 天才的数学家冯·诺伊曼
. d) _  G: e/ x  E" q$ V" p看冯·诺伊曼的故事,他有句名言:“若人们不相信数学简单,只因他们未意识到生命之复杂。”: v' @: G+ \6 c* f2 M" E
/ o3 @! ^( v' J) T% m! C
他有个好朋友,据说是最好的朋友,是生于匈牙利的波兰犹太人数学家乌拉姆,这位先生曾参与曼克顿计划(核武器上有Teller-Ulam design,Teller指爱德华·泰勒)。他亦有参与研究核能推动的航天飞机。在纯数学上,遍历理论、数论、集合论和代数拓扑都有他的足迹。+ c" x6 B- w  {/ H# H
% q; [% J, C$ A" O1 F9 d0 i9 [0 Y4 {
所以我在这里要说的幸运数不是中餐馆的饼干里给你的数字,也不是买彩票开奖的数字,而是在1955年波兰数学家乌拉姆提出的一个自然数列,用类似埃拉托斯特尼筛法的算法后留下的整数集合。
5 p% U, c: q7 v- L4 v" O" b
4 G/ x+ p* E% |In number theory, a lucky number is a natural number in a set which is generated by a "sieve" similar to the Sieve of Eratosthenes that generates the primes.' E5 H  N! p" o) \
; v, e! W# ~$ ]# H. L! J
幸运数的定义; s5 m, a5 f" |+ [! m8 q
FORMULA       
2 B& H2 f2 \* B5 ]+ |+ r8 oStart with the natural numbers. Delete every 2nd number, leaving 1 3 5 7 ...; the 2nd number remaining is 3, so delete every 3rd number, leaving 1 3 7 9 13 15 ...; now delete every 7th number, leaving 1 3 7 9 13 ...; now delete every 9th number; etc.: [( B6 t2 c9 b; U2 F; ?' e' ?' A. t
1 j1 f( w1 H3 U
具体一点来说说幸运数列怎么筛选出来的(喜欢数论的同学一定知道挑选素数的埃拉托斯特尼筛法,这个办法是类似的)1 j: a* e' G1 a: D
  f+ q8 h( K, E. W" e
初始,从1开始的自然数列:6 h1 W9 v( r; s- ?- C
Begin with a list of integers starting with 1:9 ]/ I5 v. C- q
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  ……) d! c  O+ @) l, J; X* U7 O
+ B- l$ Z  V1 T* H3 X' X  \( k
开始删除,在这个数列里,从2开始,首先是每隔2个数字,删除第二个数字。剩下来的数字是奇数~~5 w2 f. c! e1 T# ?! A2 ?; v2 `
剩下的数列如下:
7 y2 ~' i* L* [! q! L: zEvery second number (all even numbers) is eliminated, leaving only the odd integers:6 s! M+ J8 _$ C* w
1                3                5                7                9                11                13                15                17                19                21                23                25  ……
# W9 S& Q7 T3 K& _! l) {+ F3 L; B# [" H& }/ [$ v5 }  D2 o
接下来是3,每隔3个数字删除第三个。剩下的数列如下:
3 t; c) S' `, ^& y- u  bThe second term in this sequence is 3. Every third number which remains in the list is eliminated:
0 |/ Y: N+ a1 T( b7 n* r) c9 O1                3                                7                9                                13                15                                19                21                                25  ……
- B* X3 q% b6 O
7 }' E: h, [) f1 [1 R& T+ w现在接下来的数字是7,所以把上述数列中每第七个删除,剩下的数列是:
! \3 b  o( J, M- qThe next surviving number is now 7, so every seventh number that remains is eliminated:
- {+ O/ R  `# U. b1                3                                7                9                                13                15                                                21                                25  ……
: E0 E9 d# Q' ~7 q; X# z( |( [4 H) s# W$ c) t& _
接下来是9,……5 F& t. _) [( }$ t! n
这个过程可以一直无限继续下去,被幸运地留下来的数字就是幸运数。9 N! Q5 v" Y* p0 R! ?4 Z

. B1 C3 w+ }. ~! W, k# x% n7 ~1, 3, 7, 9, 13, 15, 21, 25, 31, 33, 37, 43, 49, 51, 63, 67, 69, 73, 75, 79, 87, 93, 99, ... (sequence A000959 in OEIS).
* c* ?; Z5 f+ S1 g; ^% j% G' U. A在OEIS编号为A000959的数列就是Lucky numbers& U& H3 F" I! j3 |
上述链接给了一个稍微长一点的幸运数列:, q* D, M1 C* z. @" T
1, 3, 7, 9, 13, 15, 21, 25, 31, 33, 37, 43, 49, 51, 63, 67, 69, 73, 75, 79, 87, 93, 99, 105, 111, 115, 127, 129, 133, 135, 141, 151, 159, 163, 169, 171, 189, 193, 195, 201, 205, 211, 219, 223, 231, 235, 237, 241, 259, 261, 267, 273, 283, 285, 289, 297, 303 ……0 ]! q" E" v" z# v; F' r8 H# M( U! A

7 L. q  O1 M) x. Z有没有同样喜欢看数字的同学告诉我,你看了这个数列发现的是什么呢?
# c! D& R+ I' Q$ f& G1 v, }8 E& R9 ?$ p! y  u6 v1 a: e! e
) K1 }) p* N4 h

* z5 n( w5 G1 y" S, n第一个短一点的数列,我发现,1,3,5,7的平方(1,9,25,49)都是幸运数,但9的平方81就不是,于是马上想,那么是不是只有奇素数的平方才是幸运数呢?答案是不,11的平方也不是。于是叶子的第一个猜想就在几秒里被叶子证明是错误的。
+ E4 W  H: T9 ^" q  c( `8 i0 I% G4 s9 P% ^) @
数论里的各种数列是数学里最容易上手理解的,不过最迷人最折磨人的也是它。著名的例子就是哥德巴赫猜想(Goldbach's conjecture)。# X1 V' v. N9 o4 o
幸运数的挑选过程,类似上面提到过的埃拉托斯特尼筛法挑选素数的过程,同时也和这个著名猜想有关。
* q/ u' O& v- f- |& z( \另外幸运数也曾经在正式进入书面讨论的时候被建议叫做 "the sieve of Josephus Flavius",因为它的挑选让大家想到著名的约瑟夫斯问题。6 m  D+ O3 U% s- d9 ?6 U' W7 A7 v

1 Y! R8 `6 ^# s, s暂时就到这里吧,接下去要不要继续聊引出来的概念和问题呢?
+ y/ E9 m& ^7 K8 j, v% s/ }' ]) C; R8 Z$ J# Z! Y: |
**什么叫做Conjecture?
% Q( E3 O- o5 s4 h$ ]2 e* P**约瑟夫斯问题。
作者: 到处停留的叶子    时间: 2014-7-16 21:26
猜想(conjecture)和假说(Hypothesis)
8 X% U: ?. B- ]; U
" Y& p- D( ]2 T9 x6 Q5 I* C6 Q猜想(conjecture)是一个看上去是真的,但尚未被证明的叙述。比如说上面提到的数学数列,因为它表现的没有规律和无限性,基于观察的某些结论,如果不能用科学逻辑的方法来证明在无限的未来它都是真的,那么之前所观察到的所有事实都仅仅是看上去是正确的。
& L0 U# _' {9 ?. T6 E6 _2 B6 H7 O1 g
当猜想被证明后,它便会成为定理。猜想一日未成为定理,数学家都要小心在逻辑结构之中使用这些猜想。  d& T# K( z- L* t9 `- u$ s: S3 J

& R+ s! P9 F6 l' [+ i猜想主要因为类比推理和偶然发现的巧合而出现。数学家通常会使用不完全归纳法,来测试自己的猜想。例如费马曾经根据首四个费马数是素数,便猜想所有费马数都是素数(此猜想已被推翻)' N* `3 x4 [  `9 Y' I
; D# @( q. M! h! _) P5 X, L6 r
假说(Hypothesis),即指按照预先设定,对某种现象进行的解释,即根据已知的科学事实和科学原理,对所研究的自然现象及其规律性提出的推测和说明,而且数据经过详细的分类、归纳与分析,得到一个暂时性但是可以被接受的解释。任何一种科学理论在未得到实验确证之前表现为假设学说或假说。5 S; P" y, N  \& r! Y! F
# X! M* J$ I  p1 u$ U3 x- J& V
有的假设还没有完全被科学方法所证明,也没有被任何一种科学方法所否定,但能够产生深远的影响。如1900年德国物理学家马克斯·普朗克为解决黑体辐射谱而首先提出量子论(量子假说)。
作者: 农民家的狗    时间: 2014-7-16 21:58
不明觉厉
作者: 到处停留的叶子    时间: 2014-7-17 06:50
本帖最后由 到处停留的叶子 于 2014-7-16 17:53 编辑   \0 ?' d2 S- {
/ b" s: F! b8 x9 q# F" i+ n! t& ~2 ]
**约瑟夫斯问题    都教授 ! c6 y) a2 @" L, U/ S5 |+ L0 v

  Q& z5 S! B4 \! r! n我们来聊聊约瑟夫斯问题。
0 I9 N7 \* S3 H4 G% t  S% A5 \; C; U- D$ v5 b$ d! C
有n个囚犯站成一个圆圈,准备处决。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。7 o6 F/ a7 U: x; ?

; A! S" Z& L( O问题是,给定了n和k,一开始要站在什么地方才能避免被处决?
8 q! }  h- r) r! v4 i# n2 M) L2 j8 p3 Y, F* `

" K( e0 M. N" u( ]3 c. \& n$ b/ n---------------------------------------不思考的分割线---------------------------------------------
+ n7 X+ r0 J8 ]$ T5 P* i/ u据说这个问题是一个经常出现在计算机算法中的问题,不过当年我读书的时候对它并没有特别注意。在计算机编程的算法中,类似问题又称为约瑟夫环。老兵和神牛肯定比我清楚得多。我就不多说什么算法了。牛教授 兵教授  
- \7 m# v+ z9 X8 T& V# [6 d# w- b6 y0 |9 e
---------------------------------------历史八卦的分割线----------------------------------/ C6 u6 L$ a7 Q# i
这个问题是以弗拉维奥·约瑟夫斯命名的,他是1世纪的一名犹太历史学家。
0 ~) v% E/ _) f* R$ c" Z4 v) T; Y据载,他在自己的日记中写道,他和他的40个战友被罗马军队包围在洞中。他们讨论是自杀还是被俘,最终决定自杀,并以抽签的方式决定谁杀掉谁。约瑟夫斯和另外一个人是最后两个留下的人。约瑟夫斯说服了那个人,他们将向罗马军队投降,不再自杀。约瑟夫斯把他的存活归因于运气或天意。   
作者: 独角兽    时间: 2014-7-17 09:30
到处停留的叶子 发表于 2014-7-17 06:50
/ }6 @& y$ m% U! B**约瑟夫斯问题    都教授 # v3 `% z1 O8 t; [! \% X
+ r% a0 Q" U7 g& Q* F: |, {
我们来聊聊约瑟夫斯问题。

7 b0 K/ k. ?0 ?) L" e, T1 C1. 经过努力学习,这题我能用java编程做了,oh yeah!- C$ Z- {8 m7 f7 c" G4 g- e1 R

: Y1 @! ~/ D" O+ c2. 但叶子问我的不是编程。对于给定的k,我可以用倒推法硬推。但是,想了半天也没有想到不用推的直接算法。8 s8 l# c" ?8 t: u
5 `2 t9 ~/ w1 {: |! l5 h! m# a1 W$ @' G
推的方法如下:
6 l: N9 v2 N% B5 i3 r
1 S% C0 E0 v0 w/ ]4 j: A7 sn=1,就一号,跑不掉的/ c5 ]) |) O7 B4 x5 `5 R
n=2, 要站 (k+1) 模 n 那一号设a(2),比如 k=2, 则 a2=1 (号); 若 k=3, 则 a2=2 ' A! R3 l  G$ ^& ^1 P0 z6 @  C4 b
如此类推,n=i 时,要站在 a(i-1)+k 模 n 那一号。比如,k=6, n=19 时 要站在14号。
1 x9 T& I/ r" A0 t% U, O
. U6 D+ |" s0 H; k# H6 g
1 q) ?' {2 R4 Q( Y# B" P/ W8 d我算到k=6都找不出更直接的规律,不好玩
作者: 到处停留的叶子    时间: 2014-7-17 11:02
本帖最后由 到处停留的叶子 于 2014-7-16 22:06 编辑
) v6 m# ]/ h, T' d# Q
独角兽 发表于 2014-7-16 20:30 8 z  f- o8 R4 `. |9 }) S- \
1. 经过努力学习,这题我能用java编程做了,oh yeah!7 s9 h  {5 y2 i# b' t
4 a3 S, L+ _' ^: @& H3 d8 T
2. 但叶子问我的不是编程。对于给定的k,我可以用 ...
* k( J/ {$ b* p# E; i6 n1 \

% U5 N) P' w  C3 D9 d& D* F5 `6 d0 ?兽兽真是爱动脑筋啊~~我现在遇到这类问题第一想到的是打电话找高手解答,或者先在网上找找看
0 l2 T* Z/ }# K" j" G% g; |& `% s5 w1 x8 L/ F- T; N% O
在维基上看到K=2的解法和还有K≠2的通用解法,这里摘抄过来那段关于n的有趣分析。- \' w7 H$ R- a$ }5 w: x' ?

9 B* e3 S* g# J' R还有下面我抄了两个通用算法,那个java的是不是和你做的一样啊?
5 `' S3 p- a: U, ~
' P9 k+ `" {  Z-----------------------------不动脑筋的分割线--------------------------
: l5 q+ Y7 j+ Z" U: p, d0 v6 W2 Z/ [% B4 Q. @: V
一个小心翼翼的Java例子:) E6 c0 p' _) |, c9 {4 A* Q

+ ]+ Y+ Q  L, T( C1 x. M" H int josephus(int n, int k) {
! [1 |+ N1 c0 q% _! b. W6 w, H        return josephus(n, k, 1);" y& N8 b$ F9 r) b, k
  }* l+ m2 X6 z* i: a$ u; @
  int josephus(int n, int k, int startingPoint) {" x2 H" D! }0 u
      if(n == 1)
( d8 I. S' ^2 {; A7 B8 V3 F          return 1;
8 y0 ?& W$ ~* M, H. n. i, L4 b      int newSp = (startingPoint + k - 2) % n + 1;5 @1 E+ j/ n( q! P
% X6 W0 c( m0 L5 `9 p. {, ^+ W
      int survivor = josephus(n - 1, k, newSp);$ _# B7 L5 G6 [; q/ H% {( Y8 t
      if (survivor < newSp) {
  s8 S% d' c5 b5 \. `) Q* o* L- |          return survivor;# q2 v  J0 E6 Y- ~4 p/ n* j
      } else
5 \# p# f) e  g) C0 S5 J          return survivor + 1;
6 Q8 B, A* a( O  }
+ R1 O+ J) z* L/ u. w# e, h/ R: n( H: p- [, j) P
另外有个更简洁的例子" R2 m5 T1 [' `* ~/ b2 C. t
  def josephus(n, k):
. U7 [: B0 c$ [9 s: ?    if n ==1:
0 m0 d1 U0 y4 x6 p* ]      return 19 q- b% D  ]1 X" ?( C
    else:, j! C& B2 n6 b1 A) M8 k
      return ((josephus(n-1,k)+k-1) % n)+1" [6 j- z7 b& o: \! C1 n
3 Z% o  F' w0 m" \; S
(如果n这个数字很大很大,k很小很小,电脑会不会转晕过去呢?)
9 N: m# e! {! E- r2 B* b! ]1 p' K' |1 E
以上摘自 http://en.wikipedia.org/wiki/Josephus_problem#Solution
, `; S1 {2 G0 _+ D" N9 n) I
4 E3 F" Z5 h, M! n2 J
& I" }* z7 ^* w4 P9 Q关于n的分析:. \- j; q' `. Y3 s
设f(n)为一开始有n个人时,生还者的位置。
& [: M3 d- q$ z  @如果一开始有偶数个人,则第二圈时位置为x的人一开始在第2x - 1个位置。因此位置为f(2n)的人开始时的位置为2f(n) - 1。这便给出了以下的递推公式:$ H# z& u! i/ Z' |8 C' N
; q+ V5 S- o7 y( h. A0 U
f(2n)=2f(n)-1
+ j3 y+ N/ E, O, z( x如果一开始有奇数个人,则走了一圈以后,最终是号码为1的人被杀。于是同样地,再走第二圈时,新的第二、第四、……个人被杀,等等。在这种情况下,位置为x的人原先位置为2x+1。这便给出了以下的递推公式:
3 J2 R$ p4 N0 I5 n3 [
" _9 |, d  P+ D' A- `! f5 h- Uf(2n+1)=2f(n)+1
8 W+ o. b1 j; |/ K' g& }! G3 `: i+ K0 Z/ i" `

% i7 r: C9 x% w. V2 c! Y. v  z如果我们把n和f(n)的值列成表,我们可以看出一个规律:) [' ?& d: C- e8 v2 f

' w* b" I* z. un    1    2        3        4        5        6        7        8        9        10        11        12        13        14        15    16* V- {' g" ~5 h4 _
f(n) 1    1        3        1        3        5        7        1        3        5        7        9        11        13        15        1# |9 {) L3 _  i6 B, g' Q+ _
4 C/ |' ~; D  \6 e) Q1 d0 N2 H
从中可以看出,f(n)是一个递增的奇数数列,每当n是2的幂时,便重新从f(n)=1开始。因此,如果我们选择m和l,使得n=2^m+l且0≤ l<2^m,那么f(n)=2 . l+1。显然,表格中的值满足这个方程。可以用数学归纳法给出一个证明。( o1 x5 ~7 R& X( o  B

/ U! \* s2 o. p% P- }定理:如果n=2^m+l且0≤ l<2^m,则f(n) = 2.l+1。9 a3 k# C0 j: o& {

  J2 w8 y( P4 Z, d- J- g8 e$ v% D1 {/ B7 c  R
答案的最漂亮的形式,与n的二进制表示有关:把n的第一位移动到最后,便得到f(n)。这可以通过把n表示为2^m+l来证明。
作者: 独角兽    时间: 2014-7-17 11:19
到处停留的叶子 发表于 2014-7-17 11:02 : M8 V; L4 W- S+ X* r+ D* s9 B
兽兽真是爱动脑筋啊~~我现在遇到这类问题第一想到的是打电话找高手解答,或者先在网上找找看
3 @7 s  Z( i& e, J/ g/ w/ @4 F+ m3 H3 ~" _8 \( W
在 ...
8 U' t5 L/ k* Q/ l3 W0 i! V! N
我的推法就是这个:
8 {2 N% g& H; S! @$ C
: F4 e% ~; k0 [" S6 f5 Z  return ((josephus(n-1,k)+k-1) % n)+1
6 Q; M8 o  o# l0 ^* {% y. E' y6 j8 F" ~
我有一点疏忽是如果整除,模的结果是0,但实际应该取n。所以这个表达式把 "+1"搞到括号外面就完全对了。0 y2 e' C! @4 T9 n" k: |

8 b6 M. i$ `/ b/ p2的情况我没单拿出来搞。
作者: leekai    时间: 2014-7-18 09:47
绕死了
作者: 常挨揍    时间: 2014-7-18 22:40
看不懂
9 t, W. Y5 A0 p2 p4 b不过今天不幸运数是17
作者: 到处停留的叶子    时间: 2014-7-19 03:04
常挨揍 发表于 2014-7-18 09:40
; X+ a$ W, Z+ l( P看不懂
3 ^! Z1 k3 U2 l! ]  o& H不过今天不幸运数是17
! V( D4 J( ~: c" L$ y! W
7月17日成了一个黑色的日子。很让人感觉生命无常。4 K- w$ b3 t5 ]; \- u3 ^7 O8 M) ]

" n+ ~" ~0 G4 o; d6 a  A: E以后出行挑日子,要找一个幸运数的交集,这里前面的9个数字也可以参考一下:1,3,7,9,13,15,21,25,313 a8 U- x% b9 P
9 B( w. ?8 R1 W* y+ B4 S% u
13号如果遇上星期五,还是算了,不要不信邪。




欢迎光临 爱吱声 (http://aswetalk.net/bbs/) Powered by Discuz! X3.2