teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

8

微修正しました。

2015/12/31 20:37

投稿

manman
manman

スコア233

answer CHANGED
@@ -5,7 +5,7 @@
5
5
  N が大きいときの計算をさせると**工夫なしより速くなりました。**
6
6
 
7
7
  ```lang-Ruby
8
- def ncr(n,r)
8
+ def ncr(n, r)
9
9
  r = [r, n - r].min
10
10
  return 1 if r == 0
11
11
  return n if r == 1
@@ -36,7 +36,7 @@
36
36
  p cnt == 2 ** N
37
37
  ```
38
38
  ```lang-Python
39
- def ncr(n,r):
39
+ def ncr(n, r):
40
40
  r = min(r, n - r)
41
41
  if r == 0: return 1;
42
42
  if r == 1: return n;

7

コードの改行をなくす。

2015/12/31 20:37

投稿

manman
manman

スコア233

answer CHANGED
@@ -53,7 +53,6 @@
53
53
  for k in range(r):
54
54
  if numerator[k] > 1:
55
55
  result *= numerator[k]
56
-
57
56
  return result
58
57
 
59
58
  N = 10000

6

コードが冗長だったので短くする。

2015/05/05 14:25

投稿

manman
manman

スコア233

answer CHANGED
@@ -40,11 +40,8 @@
40
40
  r = min(r, n - r)
41
41
  if r == 0: return 1;
42
42
  if r == 1: return n;
43
- numerator = [0 for i in range(r)]
43
+ numerator = [n - r + i + 1 for i in range(r)]
44
- denominator = [0 for i in range(r)]
44
+ denominator = [i + 1 for i in range(r)]
45
- for k in range(r):
46
- numerator[k] = n - r + k + 1
47
- denominator[k] = k + 1
48
45
  for p in range(2, r + 1):
49
46
  pivot = denominator[p - 1]
50
47
  if pivot > 1:

5

ncrに統一する。

2015/05/05 12:56

投稿

manman
manman

スコア233

answer CHANGED
@@ -5,7 +5,7 @@
5
5
  N が大きいときの計算をさせると**工夫なしより速くなりました。**
6
6
 
7
7
  ```lang-Ruby
8
- def c(n,r)
8
+ def ncr(n,r)
9
9
  r = [r, n - r].min
10
10
  return 1 if r == 0
11
11
  return n if r == 1
@@ -31,7 +31,7 @@
31
31
  N = 10000
32
32
  cnt = 0
33
33
  (0..N).each{|a|
34
- cnt += c(N, a)
34
+ cnt += ncr(N, a)
35
35
  }
36
36
  p cnt == 2 ** N
37
37
  ```

4

質問の例が悪かった反省の言葉を入れる。

2015/05/05 11:54

投稿

manman
manman

スコア233

answer CHANGED
@@ -1,7 +1,7 @@
1
1
  入山徳夫氏によるnCrを高速に求めるアルゴリズムの
2
2
  Ruby版およびPython版です。
3
3
  (Ruby版およびPython版どちらの場合も、)
4
- 質問の例だと**工夫なしの方が速い**のですが、
4
+ 質問の例だと残念ながら**工夫なしの方が速い**のですが、
5
5
  N が大きいときの計算をさせると**工夫なしより速くなりました。**
6
6
 
7
7
  ```lang-Ruby

3

Ruby版も追加しました。

2015/05/05 11:38

投稿

manman
manman

スコア233

answer CHANGED
@@ -1,9 +1,40 @@
1
- 入山徳夫氏によるnCrを高速に求めるアルゴリズムのPython版です。
1
+ 入山徳夫氏によるnCrを高速に求めるアルゴリズムの
2
- 質問の例だと
2
+ Ruby版およびPython版です。
3
+ (Ruby版およびPython版どちらの場合も、)
3
- 工夫なしの方が速いのですが、
4
+ 質問の例だと**工夫なしの方が速い**のですが、
4
- N が大きいときの計算をさせると
5
+ N が大きいときの計算をさせると**工夫なしより速くなりました。**
5
- 工夫なしより速くなりました。
6
6
 
7
+ ```lang-Ruby
8
+ def c(n,r)
9
+ r = [r, n - r].min
10
+ return 1 if r == 0
11
+ return n if r == 1
12
+ numerator = (n - r + 1..n).to_a
13
+ denominator = (1..r).to_a
14
+ (2..r).each{|p|
15
+ pivot = denominator[p - 1]
16
+ if pivot > 1
17
+ offset = (n - r) % p
18
+ (p - 1).step(r - 1, p){|k|
19
+ numerator[k - offset] /= pivot
20
+ denominator[k] /= pivot
21
+ }
22
+ end
23
+ }
24
+ result = 1
25
+ (0..r - 1).each{|k|
26
+ result *= numerator[k] if numerator[k] > 1
27
+ }
28
+ return result
29
+ end
30
+
31
+ N = 10000
32
+ cnt = 0
33
+ (0..N).each{|a|
34
+ cnt += c(N, a)
35
+ }
36
+ p cnt == 2 ** N
37
+ ```
7
38
  ```lang-Python
8
39
  def ncr(n,r):
9
40
  r = min(r, n - r)

2

コードを修正しました。

2015/05/05 11:28

投稿

manman
manman

スコア233

answer CHANGED
@@ -17,7 +17,7 @@
17
17
  for p in range(2, r + 1):
18
18
  pivot = denominator[p - 1]
19
19
  if pivot > 1:
20
- offset = (n-r) % p
20
+ offset = (n - r) % p
21
21
  for k in range(p - 1, r, p):
22
22
  numerator[k - offset] /= pivot
23
23
  denominator[k] /= pivot

1

誤字を修正しました。

2015/05/05 10:26

投稿

manman
manman

スコア233

answer CHANGED
@@ -1,7 +1,7 @@
1
1
  入山徳夫氏によるnCrを高速に求めるアルゴリズムのPython版です。
2
2
  質問の例だと
3
3
  工夫なしの方が速いのですが、
4
- N が大きいときの計算をさると
4
+ N が大きいときの計算をさると
5
5
  工夫なしより速くなりました。
6
6
 
7
7
  ```lang-Python