一袋のコインの値
一袋のアメリカ合衆国コインが銀行から盗まれた.袋を開けずに中身の金額を語ることはできるだろうか.明らかで物理的な袋の特徴はその重さだろう.コインが入った重さ1ポンドの袋を仮定し,Wolfram Knowledgebaseの通貨についての情報と線形方程式を解く組込み機能を使って,盗まれたコインの期待される値を求めることができる.
まず,隠的に定義された実体クラスを使って現在出回っているアメリカ合衆国コインのリストを返す.
In[1]:=
![Click for copyable input](assets.ja/valuate-a-bag-of-coins/In_23.png)
EntityClass["CurrencyDenomination", {EntityProperty[
"CurrencyDenomination", "IssuingCountry"] ->
Entity["Country", "UnitedStates"],
EntityProperty["CurrencyDenomination", "Format"] -> "coin"}]
Out[1]=
![](assets.ja/valuate-a-bag-of-coins/O_20.png)
[+]をクリックして隠的に定義された実体クラスを拡張し,メンバーを求め,値によってソートする.
In[2]:=
![Click for copyable input](assets.ja/valuate-a-bag-of-coins/In_24.png)
coinsUS = EntityList[
EntityClass[
"CurrencyDenomination", {
EntityProperty[
"CurrencyDenomination", "IssuingCountry"] -> Entity[
"Country", "UnitedStates"],
EntityProperty["CurrencyDenomination", "Format"] -> "coin"}]] //
SortBy[#[EntityProperty["CurrencyDenomination", "Value"]] &]
Out[2]=
![](assets.ja/valuate-a-bag-of-coins/O_21.png)
コインの画像のコラージュを作る.
In[3]:=
![Click for copyable input](assets.ja/valuate-a-bag-of-coins/In_25.png)
ImageCollage[
EntityValue[coinsUS,
EntityProperty["CurrencyDenomination", "Image"]],
Background -> White]
Out[3]=
![](assets.ja/valuate-a-bag-of-coins/O_22.png)
コインの特性を表にまとめる.
In[4]:=
![Click for copyable input](assets.ja/valuate-a-bag-of-coins/In_26.png)
TextGrid[{ImageResize[#2, 60], #1,
Row[Riffle[#3, Style[" | ", Gray]]]} & @@@
EntityValue[
coinsUS, {EntityProperty["CurrencyDenomination", "Entity"],
EntityProperty["CurrencyDenomination", "Image"],
EntityProperty["CurrencyDenomination", "PeopleOnCurrency"]}],
Alignment -> {Left, Center}, Dividers -> All] // TraditionalForm
Out[4]//TraditionalForm=
![](assets.ja/valuate-a-bag-of-coins/O_23.png)
コインの金額(セント)と質量(グラム)を求め,質量を有理数に変換する.
In[5]:=
![Click for copyable input](assets.ja/valuate-a-bag-of-coins/In_27.png)
{values, masses} =
Transpose[EntityValue[coinsUS, {"Value", "Weight"}]]
Out[5]=
![](assets.ja/valuate-a-bag-of-coins/O_24.png)
In[6]:=
![Click for copyable input](assets.ja/valuate-a-bag-of-coins/In_28.png)
coinsandweights = Transpose[{
QuantityMagnitude[UnitConvert[values, "USCents"]],
Rationalize[QuantityMagnitude[N[UnitConvert[masses, "Grams"]]]]
}]
Out[6]=
![](assets.ja/valuate-a-bag-of-coins/O_25.png)
In[7]:=
![Click for copyable input](assets.ja/valuate-a-bag-of-coins/In_29.png)
lcm = LCM @@ Denominator[Rationalize[coinsandweights][[All, 2]]];
In[8]:=
![Click for copyable input](assets.ja/valuate-a-bag-of-coins/In_30.png)
rationalcoinweights = lcm #2 & @@@ Rationalize[coinsandweights]
Out[8]=
![](assets.ja/valuate-a-bag-of-coins/O_26.png)
全体で重さが1ポンドになるコインの組合せ分布すべてを± 0.1%の誤差で求める(袋の重さは無視できるものとする).
In[9]:=
![Click for copyable input](assets.ja/valuate-a-bag-of-coins/In_31.png)
meanWeight =
QuantityMagnitude[UnitConvert[Quantity[1, "Pounds"], "Grams"]];
In[10]:=
![Click for copyable input](assets.ja/valuate-a-bag-of-coins/In_32.png)
error = Normal[Quantity[0.1, "Percent"]];
In[11]:=
![Click for copyable input](assets.ja/valuate-a-bag-of-coins/In_33.png)
{minScaledWeight,
maxScaledWeight} = {Floor[lcm meanWeight (1 - error/2)],
Ceiling[lcm meanWeight (1 + error/2)]}
Out[11]=
![](assets.ja/valuate-a-bag-of-coins/O_27.png)
FrobeniusSolveを使って,必要な重さになる可能なすべてのコイン集合を決定する.
完全なWolfram言語入力を表示する
In[13]:=
![Click for copyable input](assets.ja/valuate-a-bag-of-coins/In_35.png)
Flatten[allSolutions, 1] // Length
Out[13]=
![](assets.ja/valuate-a-bag-of-coins/O_28.png)
袋の中のコインの最小値,中央値,平均値,最大値を求める(どの組合せも同程度に起こり得ると仮定する).
完全なWolfram言語入力を表示する
Out[16]//TraditionalForm=
![](assets.ja/valuate-a-bag-of-coins/O_29.png)
合計金額の分布のヒストグラムを作る.
In[17]:=
![Click for copyable input](assets.ja/valuate-a-bag-of-coins/In_39.png)
Histogram[dollarValues, Automatic, "PDF",
AxesLabel -> {Quantity[None, "USDollars"], "fraction"}]
Out[17]=
![](assets.ja/valuate-a-bag-of-coins/O_30.png)
すべての袋の重さの分布は,かなり一様である.
完全なWolfram言語入力を表示する
In[19]:=
![Click for copyable input](assets.ja/valuate-a-bag-of-coins/In_41.png)
Histogram[weightvalues, 50, "PDF",
AxesLabel -> {Quantity[None, "USDollars"], "fraction"}]
Out[19]=
![](assets.ja/valuate-a-bag-of-coins/O_31.png)
コインの数の分布をプロットする.
In[20]:=
![Click for copyable input](assets.ja/valuate-a-bag-of-coins/In_42.png)
Histogram[Total /@ Flatten[allSolutions, 1], {5}]
Out[20]=
![](assets.ja/valuate-a-bag-of-coins/O_32.png)
金額と袋の中のコイン数の二変量分布:
In[21]:=
![Click for copyable input](assets.ja/valuate-a-bag-of-coins/In_43.png)
Histogram3D[{coins.#/100., Total[#]} & /@ Flatten[allSolutions, 1],
AxesLabel -> {Quantity[None, "USDollars"], "coins"}]
Out[21]=
![](assets.ja/valuate-a-bag-of-coins/O_33.png)