-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathB12.php
More file actions
110 lines (80 loc) · 2.57 KB
/
Copy pathB12.php
File metadata and controls
110 lines (80 loc) · 2.57 KB
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
<!-- 以下は、PHP を用いて方程式 $x^3 + x = N$ を満たす正の実数 $x$ を求めるプログラムです。
**型を明示的に記述しつつ、処理時間およびメモリ使用量にも配慮**しています。
## ✅ 解法方針:二分探索(Binary Search)
* $f(x) = x^3 + x$ は単調増加 ⇒ 二分探索で一意に解を求められる。
* 精度は **絶対誤差または相対誤差 ≤ 0.001** で十分。
* 反復回数を固定(例:100回)とすることで、誤差 $\leq 10^{-6}$ を保証。
## ✅ PHP 実装(型付きコメント付き)
<?php
declare(strict_types=1);
// 入力読み込み
$input = trim(fgets(STDIN));
$N = floatval($input);
// 初期範囲の設定(型明示: float)
$low = 0.0;
$high = max(1.0, $N);
$mid = 0.0;
// 二分探索:誤差 0.001 以下まで収束
for ($i = 0; $i < 100; $i++) {
$mid = ($low + $high) / 2.0;
$f = $mid * $mid * $mid + $mid; // f(x) = x^3 + x
if ($f > $N) {
$high = $mid;
} else {
$low = $mid;
}
}
// 結果出力(小数第6位まで)
printf("%.6f\n", $mid);
// ## ✅ 入出力例
// ### 入力:
// ```
// 2
// ```
// ### 出力:
// ```
// 1.000000
// ```
// ---
// ## ✅ 処理時間・メモリ消費量(目安)
// | 指標 | 内容 |
// | ------ | ---------------------- |
// | 時間計算量 | $O(\log N)$(最大100ステップ) |
// | 実行時間 | 約 1~3 ms(PHP 8.x CLI) |
// | メモリ使用量 | 数 MB 程度(浮動小数とループのみ) |
// ---
// ## ✅ なぜ100回ループするのか?
// * 各ステップで範囲は半分になる(二分探索)。
// * $2^{-20} ≈ 10^{-6}$ ⇒ **20~30回で十分**。
// * **100回回せば誤差 0.001 以下が保証**される。
// ---
// ## ✅ 型の明示(PHP ではコメントベース)
// PHP 8 では以下のような明示が可能:
// ```php
// /** @var float $low */
// /** @var float $high */
// /** @var float $mid */
// ```
// ---
// ## ✅ グラフのイメージ(探索)
// ```
// y = x^3 + x のグラフ
// y
// ^
// | ●
// | ●
// | ●
// | ●
// | ●
// | ●
// |●
// +----------------------------→ x
// 探索範囲が収束:
// [0 .............. N]
// [0 ....... mid]
// [mid ... high]
// ︙
// [1.0000 ± ε]
// ```
// ---
// ご希望があれば、BCMath による任意精度演算対応や、PHPUnit を使ったテストコードの追加も可能です。