SNS などで頻繁に共有される「携帯電話番号の下桁から年齢を導き出す」という計算トリックについて、その背後にあるアルゴリズムと数理的な構造を解析する。このトリックは一見すると神秘的に見えるが、実際には単純な代数演算に基づいている。
計算手順の標準化
一般的に流通している計算手順は以下の通りである。
- 携帯電話番号の下桁(0〜9)を 2 倍する
- その値に 5 を加算する
- 得られた数値を 50 倍する
- さらに 1768 を加算する
- 最後に自分の出生年份を減算する
- 結果の数値を確認する(上位桁が電話下桁、下位 2 桁が年齢)
代数式による構造解析
この手順を数学的な式に置き換えて検証する。携帯電話番号の下桁を $x$、出生年份を $y$ とする。
手順 1 から 3 までの計算は以下のように展開できる。
(x * 2 + 5) * 50 = 100x + 250
次に手順 4 で 1768 を加算する。
100x + 250 + 1768 = 100x + 2018
最後に手順 5 で出生年份 $y$ を減算する。
100x + 2018 - y
ここで、$2018 - y$ はその時点での年齢(満年齢)を意味する。したがって、最終的な計算結果は「$100 \times 電話下桁 + 年齢」となる。100 を掛けることで電話下桁が百の位にシフトし、年齢が下 2 桁に表示される構造になっている。
プログラムによる検証
このロジックを Python スクリプトで検証し、任意の年份に対応できるか確認する。変数名や構造を明確化し、計算過程を出力する。
def verify_age_trick(phone_suffix, birth_year, current_year=2018):
"""
電話下桁と出生年份から年齢推算トリックの結果を計算する
"""
# 手順 1〜3: (phone_suffix * 2 + 5) * 50
step_value = (phone_suffix * 2 + 5) * 50
# 手順 4: 年份に応じた定数を加算 (current_year - 250)
# 2018 年の場合は 1768 となる
magic_constant = current_year - 250
step_value += magic_constant
# 手順 5: 出生年份を減算
result = step_value - birth_year
# 結果の解析
calculated_suffix = result // 100
calculated_age = result % 100
return {
"result": result,
"suffix_match": calculated_suffix == phone_suffix,
"age": calculated_age
}
# 検証例
target_year = 2018
sample_data = verify_age_trick(phone_suffix=5, birth_year=1990, current_year=target_year)
print(f"計算結果:{sample_data['result']}")
print(f"下桁一致:{sample_data['suffix_match']}")
print(f"推算年齢:{sample_data['age']}")
トリックの限界と年份依存性
このアルゴリズムには明確な前提条件が存在する。まず、年齢が 2 桁(0〜99 歳)である必要がある。100 歳を超えると下 2 桁の表示が桁あふれを起こし、電話下桁との区別がつかなくなる。また、出生年份が計算基準年より未来である場合は負の年齢となり成立しない。
手順 4 で加算する定数(例:1768)は基準年份に依存する。この値は「基準年份 - 250」で算出される。したがって、年份が変わるごとにこの定数を更新する必要がある。
年份別の定数調整例は以下の通りである。
- 2019 年:1769
- 2020 年:1770
- 2021 年:1771
- 2024 年:1774
計算手順の初期値(例:【+5】や【*50】)を変更した場合でも、最終的に「$100x + 当前年份 - y$」の形に収束するように定数を調整すれば、同様のトリックを構成することが可能である。