剰余は結合的か
剰余の結合性判定APIが答えるのは、一見単純な問いです。3つの整数が与えられたとき、括弧の付け方は結果に影響するのでしょうか。本APIは剰余演算の両方の順序、左側の (a % b) % c と右側の a % (b % c) を計算し、両者が一致するかどうかを返します。3つの整数を送ると、比較の両辺の値と true または false の判定が返ります。任意精度整数で計算されるため、実用上あらゆる大きさの値に対して正確な答えが得られます。除数となる位置、b、c、または中間の剰余 b % c がゼロになる場合は、ゼロ除算の例外ではなく、明確なエラーとしてリクエストが拒否されます。小さなチェックですが、コード内の連続した剰余式が意図どおりの意味を持つかどうかを決める、重要な確認です。
無料で実行
剰余演算で括弧の付け方が問題になる理由
加算と乗算は結合的です。(1 + 2) + 3 は 1 + (2 + 3) に常に等しいため、誰も括弧を意識しません。しかし剰余演算にはそのような保証はありません。a % b % c という式は紙の上では曖昧で、多くのプログラミング言語は左から右へ評価することでこれを解決し、(a % b) % c を生成します。それがもう一方の a % (b % c) と等しいかどうかは、関係する3つの値に完全に依存します。a = 17、b = 5、c = 3 を例に取ると、左側の括弧付けは (17 % 5) % 3 = 2 % 3 = 2 となり、右側は 17 % (5 % 3) = 17 % 2 = 1 となります。両者は一致しないため、この3つ組では剰余は結合的ではありません。一方 a = 8、b = 5、c = 3 では両辺とも 0 となり、たまたま結合的です。この機能が存在するのは、この区別がコードレビューで誤りやすく、候補となるパラメータ群全体を手作業で検証するのが煩雑だからです。1回の呼び出しで決定的に判定でき、両方の中間値も返されるため、真偽値だけを鵜呑みにするのではなく、2つの括弧付けがどこで分岐するのかを正確に確認できます。
判定の計算方法とゼロ除数のルール
計算は意図的に透過的に設計されています。まず各入力が整数として解析されます。10進数文字列と JSON 数値の両方を受け付け、内部では任意精度演算を使用するため、2⁵³ の精度上限はなく、パイプラインのどこにも丸めはありません。次に左辺は (a % b) % c、右辺は a % (b % c) として評価されます。% は JavaScript、C、Java でおなじみの切り捨て方式に従い、結果は被除数の符号を取ります。2つの結果は厳密な等価性で比較され、両辺の値とともに答えが報告されます。真偽の答えが存在しない状況が1つあります。ゼロ除算です。2つの式には3つの除数位置が現れます。a % b の b、(a % b) % c の c、そして右辺の除数となる中間値 b % c です。b または c がゼロの場合、あるいは与えられた値で b % c がたまたまゼロになる場合、どの除数が失敗したかを明示したメッセージとともに、リクエストは不正な入力として拒否されます。このエラーに課金されることはないため、プログラムからパラメータ範囲を安全に調査できます。各フィールド最大2048桁の10進数まで入力を受け付けます。
このチェックが価値を発揮する場面
最も多い利用者は、数論を教える人や学ぶ人です。結合性の問題は教科書や問題集に頻出し、何百もの3つ組に対する主張を数秒で検証できれば、面倒な作業が実験に変わります。2番目は、ハッシュバケットやシャーディングのロジックをリファクタリングする開発者です。h % m % n のような式が紛れ込み、評価順序によって意味が静かに変わるため、本番環境で実際に使われる法の組に対して結合性を確認すれば、書き換えが安全かどうかが分かります。3番目は、記号計算や式の簡約化ツールを構築する人々で、書き換えルールを適用する前にその妥当性を知る必要があります。このページの無料計算機は有料エンドポイントとまったく同じコードで動作するため、ブラウザでテストした結果がそのまま統合先で得られます。自動呼び出しは1リクエスト $0.002 で、単位ごとの追加料金はありません。フィールド a、b、c を持つ JSON オブジェクトを送信してください。レスポンスは入力をそのまま返し、left と right を10進数文字列として報告し、最終判定を associative フィールドで返します。両方の括弧付けが一致すれば true、しなければ false です。
活用例
数論の演習問題セットを検証する
各括弧付けを手計算する代わりに、何十もの3つ組に対する結合性の主張を数秒で確認し、不一致の場合は両辺の値を見ることができます。
ハッシュバケットやシャーディングの式を監査する
トラフィックを振り分ける式をリファクタリングする前に、本番コードで h % m % n を安全に括弧付けし直せるかどうかを確認します。
式の簡約化ルールを支える
記号計算ツールが、連続する剰余の再結合が具体的な値に対して有効かどうかを、書き換え適用前に判定できるようにします。
よくある質問
料金はいくらですか?
1リクエスト $0.002 で、単位ごとの追加料金はありません。このページ上でブラウザから無料で実行することもできます。
具体的に何を比較するのですか?
左側の括弧付け (a % b) % c と、右側の括弧付け a % (b % c) を比較します。両方の値を返し、等しい場合は true を返します。
除数がゼロの場合はどうなりますか?
リクエストは不正な入力として拒否されます。これには b = 0、c = 0、および右辺の除数がゼロになる b % c = 0 という、より見落としやすいケースも含まれます。
整数は負でも構いませんか?
はい。剰余は JavaScript、C、Java の切り捨て方式に従い、結果は被除数の符号を取ります。
整数はどのくらい大きくできますか?
各フィールド最大2048桁の10進数まで対応し、任意精度演算で計算されるため、丸めや 2⁵³ の上限はありません。
答えはキャッシュされたりランダムになったりしますか?
いいえ。計算は完全に決定的であり、同じ3つの整数からは常に同じ left、right、判定が得られます。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/math/is-modulo-associative \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"a":"17","b":"5","c":"3"}'const res = await fetch("https://api.kit.forhosting.com/math/is-modulo-associative", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"a": "17",
"b": "5",
"c": "3"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/math/is-modulo-associative",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"a": "17",
"b": "5",
"c": "3"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/math/is-modulo-associative", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"a":"17","b":"5","c":"3"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"a":"17","b":"5","c":"3"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/math/is-modulo-associative", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"a": "17",
"b": "5",
"c": "3"
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "math.is_modulo_associative",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_digits | 2048 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |