支払いごとに返し合うと、送金は一瞬で膨らむ
5人でホームパーティをした。食材のまとめ買いはAさん、飲み物はBさん、ケーキはCさんが立て替えた。この状態で「立て替えた人にその都度返す」をやると、送金は支払い1件につき人数分ずつ増えます。後で挙げる実例だと、支払い5件を1件ずつ精算して延べ18回。同じ相手どうしの貸し借りを打ち消し合わせても、5人がつくる10組すべてのペアに金額が残って10回です。
ところが、実際に必要な送金は4回だけです。往復している分は、そもそも動かさなくていいお金だからです。この記事では、その4回をどう導くのかを、SplitPayが内部で走らせている計算の中身まで開いて説明します。旅行のように日をまたぐ場面の記録の取り方や段取りは旅行の割り勘・立て替え精算ガイドにまとめてあり、ここでは計算そのものを扱います。
実例:5人・合計31,000円のホームパーティ
| 支払い | 金額 | 払った人 | 対象 |
|---|---|---|---|
| 食材のまとめ買い | 12,500円 | Aさん | 全員 |
| 飲み物 | 9,000円 | Bさん | 全員 |
| ケーキ | 4,200円 | Cさん | 全員 |
| 追加のお酒 | 3,000円 | Aさん | AさんBさんDさんの3人 |
| 紙皿・掃除用品 | 2,300円 | Eさん | 全員 |
全員が対象の共通費用は28,000円、追加のお酒だけAさんBさんDさんの3人分。Dさんは1円も出していません。
核心は、貸し借りを1人1つの数字に潰すこと
精算の計算で最初にやるのは、「誰が誰にいくら貸している」という関係を全部忘れることです。代わりに人ごとに持つのは、次の1つの数字だけ。
残高 = 実際に払った額 − 自分が負担すべき額
プラスなら受け取る側(払いすぎている)、マイナスなら払う側(払い足りない)。負担すべき額は、支払い1件ごとに「金額 ÷ 対象人数」を対象者に振り分けて足し上げれば出ます。
この残高には、必ず成り立つ性質があります。全員分を足すと必ず0になることです。1件の支払いは、払った人にプラスの金額を、対象者にマイナスの金額を、同じ総額だけ配る操作にすぎないからです。逆に言えば、合計が0にならなければ入力のどこかが間違っている。そのまま検算に使えます。
残高を出す:負担すべき額と実際に払った額の差
| メンバー | 負担すべき額 | 実際に払った額 | 残高 |
|---|---|---|---|
| Aさん | 6,600円 | 15,500円 | +8,900円(受け取る) |
| Bさん | 6,600円 | 9,000円 | +2,400円(受け取る) |
| Cさん | 5,600円 | 4,200円 | −1,400円(払う) |
| Dさん | 6,600円 | 0円 | −6,600円(払う) |
| Eさん | 5,600円 | 2,300円 | −3,300円(払う) |
共通費用28,000円÷5=5,600円。追加のお酒に加わったAさんBさんDさんは1,000円ずつを足して6,600円。負担・支払いの各列の合計はどちらも31,000円で、残高の合計は8,900+2,400−1,400−6,600−3,300=0になります。
支払いごとに返す場合と、残高で相殺する場合
支払いごとに返し合う
送金10回1件ずつ返すと延べ18回。同じ相手どうしを打ち消し合わせても、10組すべてのペアに金額が残って10回
残高で相殺してまとめる
送金4回Aさんの受け取り8,900円=6,600円+2,300円、Bさんの2,400円=1,000円+1,400円
送金の組み方:大きい者同士から当てていく
残高が出れば、あとは送金の組み合わせを作るだけ。手順はこれだけです。
- マイナスの人(払う側)を、マイナスが大きい順に並べる
- プラスの人(受け取る側)を、プラスが大きい順に並べる
- 両方の先頭を突き合わせ、絶対値が小さいほうの金額を送金1件にする
- 残高が0になった人は列から抜け、残っている人は次の相手へ進む
実例に当てはめます。払う側はDさん(−6,600円)Eさん(−3,300円)Cさん(−1,400円)の順、受け取る側はAさん(+8,900円)Bさん(+2,400円)の順です。まずDさんがAさんへ6,600円を送るとDさんが抜け、Aさんの残りは2,300円。次にEさんがその2,300円を埋めるとAさんが抜け、Eさんには1,000円の借りが残ります。それをBさんへ送るとEさんも抜けて、Bさんの残りは1,400円。最後にCさんの1,400円がぴったり収まって全員0です。
1人の貸しが複数人の借りで埋まることも、1人の借りが2人に分かれることもありますが、手順は同じです。この「先を考えず、目の前で一番大きいところ同士を当て続ける」やり方を貪欲法(グリーディ法)と呼びます。SplitPayの精算もこの手順です。
送金回数には上限があります。残高が0でない人がn人いるなら、多くてもn−1回。1回の送金で必ず誰か1人の残高が0になり、他の全員が0になれば最後の1人も自動的に0になるからです(合計が0なので)。5人全員に残高が残っていた実例は、上限ちょうどの4回。素朴に返し合った10回の半分以下です。
電卓でやるなら、この4ステップ
支払いを1つの表に書き出す
「金額・払った人・対象者」の3列で全件並べます。対象が全員ではない支払いを取りこぼさないことが、ここではいちばん大事です。
人ごとの負担額を積み上げる
1件ずつ金額を対象人数で割り、対象者の欄に足していきます。割り切れないときは丸め方を先に決めてから進めてください。方針は[割り勘の端数はどうする?](/guides/rounding-rules)にあります。
残高を出して合計0を確認する
「実際に払った額 − 負担額」を人ごとに計算し、全員分を足します。0にならなければ支払いの足し忘れか対象者の指定ミスなので、次へ進む前に直します。
大きい順に突き合わせる
マイナス最大の人からプラス最大の人へ、絶対値が小さいほうの金額を送金にします。片方が0になったら外して次へ。全員0になったら完了です。
「本当の最小回数」を求めるのは、実はとても難しい
正直に書くと、貪欲法が出す回数は理論上の最小とは限りません。5人の残高が+4,000/+3,000/+2,000/−4,000/−5,000円だったとします。大きい順に当てると送金は4回ですが、−4,000円の人を+4,000円の人にまっすぐつなぎ、残った−5,000円を+3,000円と+2,000円に分ければ3回で済みます。ぴったり打ち消し合うグループを見つけられれば減らせるわけです。
では常に最小を探せばいいかというと、そう単純ではありません。「合計がちょうど0になる部分集合」を洗い出す問題(部分和問題)を含むため、人数が増えると調べる組み合わせが爆発的に増えます。計算機科学ではこれをNP困難、つまり現実的な時間で厳密に解く方法が知られていない種類の難しさ、と分類します。
ちなみに上のホームパーティの残高には、打ち消し合うグループが1つもありません。だからあの4回は本当の最小です。割り勘の人数はふつう数人から数十人で、その範囲なら貪欲法の結果は最小と一致することが多く、ずれても1〜2回。厳密さを待たせるより、送金先がすぐ確定するほうを採っています。
合計支出
¥7,300
精算方法
精算の計算でよくある質問
Q.送金回数はどこまで減らせますか?
残高が0でない人がn人なら、n−1回が上限です。実例の5人はちょうど4回でした。同額で打ち消し合う組み合わせがあればさらに減ります。なお、支払いが何件に増えても送金回数は増えません。効くのは人数だけです。
Q.端数が出て残高がきれいに0にならないときは?
丸め方を先に決めて、丸めたあとの数字で残高を計算し直します。1円単位のまま割って1人だけ1円多く負担する形にすれば、合計は必ず一致します。選び方は割り勘の端数はどうする?を参照してください。
Q.人によって負担割合を変える場合も、同じ計算でできますか?
できます。変わるのは「負担すべき額」の出し方だけで、残高にしてから突き合わせる部分は同じです。先輩が多め・後輩が少なめのような配分は割り勘の傾斜配分にまとめています。
Q.手計算とアプリで金額が合いません
多くは丸めるタイミングの違いです。1件ごとに丸めてから足すか、全部足してから丸めるかで数円ずれます。送金の組み合わせが違うだけなら、各人の残高さえ一致していれば同じ結果です。誰から誰へ送るかに正解は複数あります。
まとめ
- 精算の計算は、貸し借りの関係を捨てて人ごとの残高1つに潰すところから始まる
- 残高=実際に払った額−負担すべき額。全員分の合計は必ず0になり、そのまま検算に使える
- マイナスが大きい人からプラスが大きい人へ順に当てる貪欲法だけで、送金の組み合わせは作れる
- 残高が0でない人がn人なら送金は多くてもn−1回。5人・31,000円の実例は18回でも10回でもなく4回
- 厳密な最小回数を求める問題はNP困難だが、割り勘の人数なら貪欲法との差は1〜2回にとどまる