Skip to content

Commit f4dacbd

Browse files
authored
Merge pull request #58 from myoshi2891/dev/macbook_pro
繰り返し二乗法(Exponentiation by Squaring)
2 parents 946752f + 31be823 commit f4dacbd

3 files changed

Lines changed: 113 additions & 0 deletions

File tree

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
const fs = require('fs');
2+
3+
// 入力読み取り
4+
const input = fs.readFileSync('/dev/stdin', 'utf8').trim();
5+
const [A, B, M] = input.split(' ').map(Number);
6+
7+
// 繰り返し二乗法
8+
function modPow(a, b, m) {
9+
let result = 1;
10+
a = a % m;
11+
while (b > 0) {
12+
if (b & 1) {
13+
result = (result * a) % m;
14+
}
15+
a = (a * a) % m;
16+
b >>= 1;
17+
}
18+
return result;
19+
}
20+
21+
// 出力
22+
console.log(modPow(A, B, M));
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
def modpow(a: int, b: int, m: int) -> int:
2+
ans = 1
3+
while 0 < b:
4+
if b & 1 == 1:
5+
ans = (ans * a) % m
6+
a = (a * a) % m
7+
b >>= 1
8+
return ans
9+
a: int
10+
b: int
11+
m: int
12+
a, b, m = map(int, input().split())
13+
print(modpow(a, b, m))
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
繰り返し二乗法(Exponentiation by Squaring)を用いて `A^B mod M` を高速に計算する JavaScript のコードです。標準入力に対応しています(`fs` モジュールを使用)。
2+
3+
---
4+
5+
### ✅ JavaScript 解答コード(繰り返し二乗法 + 標準入力対応)
6+
7+
```javascript
8+
const fs = require('fs');
9+
10+
// 入力読み取り
11+
const input = fs.readFileSync('/dev/stdin', 'utf8').trim();
12+
const [A, B, M] = input.split(' ').map(Number);
13+
14+
// 繰り返し二乗法
15+
function modPow(a, b, m) {
16+
let result = 1;
17+
a = a % m;
18+
while (b > 0) {
19+
if (b & 1) {
20+
result = (result * a) % m;
21+
}
22+
a = (a * a) % m;
23+
b >>= 1;
24+
}
25+
return result;
26+
}
27+
28+
// 出力
29+
console.log(modPow(A, B, M));
30+
```
31+
32+
---
33+
34+
### 🔍 処理の流れ(`2^13 mod M` の例をもとに)
35+
36+
```
37+
初期状態:
38+
a = 2, b = 13 → b(2進数) = 1101, m = 7, result = 1
39+
40+
1回目: b & 1 = 1 → result = result * a = 1 * 2 = 2
41+
a = a * a = 4, b = 6 (110)
42+
43+
2回目: b & 1 = 0 → result unchanged
44+
a = 16, b = 3 (11)
45+
46+
3回目: b & 1 = 1 → result = 2 * 16 = 32
47+
a = 256, b = 1
48+
49+
4回目: b & 1 = 1 → result = 32 * 256
50+
a = 65536, b = 0
51+
52+
最後に result % 7 = 4 を返す
53+
```
54+
55+
---
56+
57+
### ✅ 実行例
58+
59+
#### 入力:
60+
61+
```
62+
2 5 7
63+
```
64+
65+
#### 出力:
66+
67+
```
68+
4
69+
```
70+
71+
---
72+
73+
### ⏱ 計算量
74+
75+
* 時間計算量: `O(log B)` (Bの2進数のビット長に比例)
76+
* 空間計算量: `O(1)`
77+
78+
---

0 commit comments

Comments
 (0)