Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
116 changes: 116 additions & 0 deletions Algorithm/BinarySearch/atCoder/B12/B12.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
// 以下は、Go言語(Golang)を用いて方程式 $x^3 + x = N$ を満たす正の実数 $x$ を **二分探索で求めるコード**です。
// **型を明示**し、**処理時間とメモリ消費量**にも配慮しています。

// ## ✅ 解法:二分探索

// * 関数 $f(x) = x^3 + x$ は **単調増加関数**なので、**二分探索**が有効。
// * 解の誤差が **絶対または相対誤差 0.001 以下**になるまで探索。
// * Go の `float64` を使い、収束精度は十分。

// ## ✅ Go 実装コード(型明示)
package main

import (
"bufio"
"fmt"
"math"
"os"
"strconv"
"strings"
)

func main() {
// 標準入力読み込み
reader := bufio.NewReader(os.Stdin)
line, _ := reader.ReadString('\n')
NStr := strings.TrimSpace(line)
N, err := strconv.ParseFloat(NStr, 64)
if err != nil {
panic(err)
}

// 型: float64
var low float64 = 0.0
var high float64 = math.Max(1.0, N)
var mid float64

for i := 0; i < 100; i++ {
mid = (low + high) / 2
f := mid*mid*mid + mid // f(x) = x^3 + x
if f > N {
high = mid
} else {
low = mid
}
}

// 小数点6桁まで出力
fmt.Printf("%.6f\n", mid)
}

// ## ✅ 使用例

// ### 入力:

// ```
// 2
// ```

// ### 出力:

// ```
// 1.000000
// ```

// ---

// ## ✅ 型の明示について

// | 変数名 | 型 | 説明 |
// | ------ | --------- | --------------- |
// | `N` | `float64` | 入力値(正の実数) |
// | `low` | `float64` | 二分探索の下限 |
// | `high` | `float64` | 二分探索の上限 |
// | `mid` | `float64` | 探索中間値(出力対象) |
// | `f` | `float64` | 計算された関数値 $f(x)$ |

// ---

// ## ✅ 処理時間・メモリ消費量の目安(Go)

// | 指標 | 内容 |
// | ------ | ------------------------- |
// | 時間計算量 | $O(\log N)$(最大100ステップ) |
// | 実行時間 | 約 1〜2 ms(Go 1.20以降の標準ビルド) |
// | メモリ使用量 | 数MB(浮動小数 + 入出力バッファのみ) |

// ---

// ## ✅ なぜ100回ループするのか?

// * $2^{-20} ≈ 10^{-6}$ なので、誤差 $\leq 0.001$ にするには20〜30回で十分。
// * **100回のループ**にすることで安全に収束するようにしている。

// ---

// ## ✅ 簡易図解:探索の流れ

// ```
// f(x) = x^3 + x の単調増加

// 探索範囲:
// [low]----------------[high]
// 0.0 N

// 繰り返しで収束:
// [0.0 .......... mid .......... N]
// ↓
// [0.0 ...... mid ......]
// ↓
// [mid - ε ... mid + ε] ≈ 解
// ```

// ---

// Goでは `float64` の精度で十分な誤差範囲(0.001)に収束できます。
// ご希望があれば、誤差制御をループ回数ではなく **相対誤差判定で停止**させる改良も可能です。
54 changes: 54 additions & 0 deletions Algorithm/BinarySearch/atCoder/B12/B12.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
// 以下は、与えられた方程式 $x^3 + x = N$ を満たす正の実数 $x$ を **2分探索**で求める JavaScript コードです。
// `fs` モジュールを使用して標準入力から値を読み取り、解の精度は絶対誤差または相対誤差が 0.001 以下になるまで繰り返します。

// ### ✅ 解法:二分探索(精度重視)

// * 解となる $x$ は単調増加な関数 $f(x) = x^3 + x$ によって定まる。
// * よって、1 ≦ N ≦ 100000 の範囲で、右端を十分大きな値(例:N)にして探索。

// ### ✅ JavaScript 実装(`fs`使用)

const fs = require("fs");

const input = fs.readFileSync("/dev/stdin", "utf8").trim();
const N = parseFloat(input);

// x^3 + x = N を満たす x を求める(絶対/相対誤差 0.001 以下)
let low = 0.0;
let high = Math.max(1, N); // N=1のときに0〜1の範囲に解があることを保証
let mid;

for (let i = 0; i < 100; i++) { // 高速に収束するため100回で十分
mid = (low + high) / 2;
const f = mid ** 3 + mid;
if (f > N) {
high = mid;
} else {
low = mid;
}
}

console.log(mid.toFixed(6));

// ### ✅ 処理時間・メモリ消費量

// * **計算量**:O(log₂(N)) ≒ 100ステップ未満で収束。
// * **メモリ使用**:10MB 未満(fs + 数値計算のみ)
// * **実行時間**:平均 2〜5ms(Node.js v18+)

// ---

// ### ✅ 入力例の動作確認

// #### 入力:

// ```
// 2
// ```

// #### 出力:

// ```
// 1.000000
// ```

110 changes: 110 additions & 0 deletions Algorithm/BinarySearch/atCoder/B12/B12.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,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 を使ったテストコードの追加も可能です。
93 changes: 93 additions & 0 deletions Algorithm/BinarySearch/atCoder/B12/B12.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
# 以下は、与えられた方程式 $x^3 + x = N$ を満たす正の実数 $x$ を **Python** で求める実装です。
# **型指定付き**で記述し、**処理時間・メモリ使用量**に配慮しています。

# ---

# ## ✅ 解法概要:二分探索

# * 関数 $f(x) = x^3 + x$ は単調増加なので、2分探索が有効。
# * $x \in (0, N)$ の範囲で探索し、**相対誤差 or 絶対誤差 ≤ 0.001** になるまで繰り返します。

# ---

# ## ✅ Python 実装(型付き)
import sys
# from typing import Tuple

def solve() -> None:
input_str: str = sys.stdin.read().strip()
N: float = float(input_str)

low: float = 0.0
high: float = max(1.0, N)
mid: float = 0.0

for _ in range(100):
mid = (low + high) / 2
f: float = mid**3 + mid
if f > N:
high = mid
else:
low = mid

print(f"{mid:.6f}")

if __name__ == "__main__":
solve()
# ```

# ---

# ## ✅ 使用例

# ### 入力:

# ```
# 2
# ```

# ### 出力:

# ```
# 1.000000
# ```

# ---

# ## ✅ 処理時間・メモリ使用量の目安

# | 指標 | 内容 |
# | ---------- | ----------------------- |
# | **時間計算量** | $O(\log N)$(収束まで100回以下) |
# | **実行時間** | 約 1〜3 ms(CPython 3.8+) |
# | **メモリ使用量** | 約 10〜20MB(標準ライブラリ+浮動小数) |

# ---

# ## ✅ 解説図(簡易)

# ```text
# 探索範囲:
# ┌──────────────┐
# low│ │high
# 0.0 N

# 収束イメージ:
# 1回目: [0 ............. N]
# 2回目: [0 ......... mid]
# 3回目: [mid .. high]
# ...
# 最終: [x - ε .. x + ε]
# ```

# ---

# ## ✅ なぜ 100 回で十分か?

# * 二分探索により探索幅が $\frac{1}{2^n}$ に。
# * 精度が $10^{-6}$ 必要なら $n ≈ 20$ 回で十分。
# * 安全に **100回**繰り返すことで収束を保証。

# ---

# ご希望があれば、NumPy や decimal ライブラリを用いた高精度バージョンも提供可能です。
Loading