Mathematica、Wolfram言語

数学研究するための問題の変形方法-Part1-

mathematicaで入試問題を変形しようpart1 入試問題
mathematicaで入試問題を変形しよう

Mathematicaを用いて、問題を変形する方法を紹介します。
まずは変形元問題をMathematicaで入試問題を解いてみます。皆さんもぜひコードを作ってみてください。次回から問題を変形する方法について紹介しますので変形しやすい問題をコードにしてみましょう

問題を変形する理由はこちら(数学で公式を発見する秘訣です)

数学で公式を発見する秘訣を教えます

これからMathematicaを使うにあたり、Mathematicaがパソコンにダウンロードされていない場合は以下を用いると無料で利用できます。

問題

図のように、4枚のカードがあり、そのうちの2枚には2、5の数字が1つずつ書かれている。何も書いていない2枚のカードには、さいころを2回投げて、1回目に出る目の数字をどちらか1枚に書くとき、2回目に出る目の数字を残りの1枚に書く。この4枚のカードを、横に1列に並べてできる4けたの整数のうち、最も小さい整数をnとする。このとき、次の問いに答えなさい。

(1)1回目に4の目が出て、2回目に2の目が出るときのnを求めなさい。

(2)nのうちで、十の位が3であるものを1つ答えなさい。

(3)nの十の位は、1、2、3、4、5、6のどの数字になることが最も起こりやすいか答えなさい。また、その確率を答えなさい。

(熊本)

ここでは、この問題をMathematicaで解く方法を紹介します。

(1)

Mathematicaのコードの例

a = 4;
b = 2;
Sort[List[2, 5, a, b]]

aを1回目に出た数、bを2回目に出た数とします。
Sort関数はリストを数の小さいもの順に並び替えます。

実行画面

よって答えは2245

(2)(3)

Mathematicaのコードの例

Map[Flatten[Sort[{{2, 5}, #}]] &,
Join[Thread[{Range[6], Range[6]}], Subsets[Range[6], {2}]]]

実行画面

3番目が3のものが答え。{2, 5, 3, 3},{2, 5, 3, 5}, {2, 5, 3, 6}

(3)は2つ目の数を比較すると確率がわかります。

プログラムの作り方

Mathematicaのコードの解説

少し難しめですので、少し解説します。

まず、最初の2数は2と5と決まっており、残りの2数は決まっていないので(固定ではないので)#とします。また、#の後には[[1]]&をつける必要があるため、&を使用します。Sort関数は4つの数を小さいもの順に並べます。

Sort[{{2, 5}, #}]&

次に、1〜6までの整数を出力するRange[6]を2つ使用します。2つを同じリストの一部として表示させるためにThread関数を使用します。

Thread[{Range[6], Range[6]}]

 

これだけでは、Range[6]の2つが同じ数を出力するので、2つのRangeを別々のものとするために、2つの要素(Range[6]の2つ)を含む部分集合を作ります。

Join[Thread[{Range[6], Range[6]}], Subsets[Range[6], {2}]]]

そして、最初の式と今の式をMap関数を用いて繋げます。

Map[{{2, 5}, #} &,
Join[Thread[{Range[6], Range[6]}], Subsets[Range[6], {2}]]]

これでも一応結果は出ますが、{}が多すぎるため、Sort[{{2, 5}, #}]&Flattenをつけます。Flatten{}を一つ減らします。

Map[Flatten[Sort[{{2, 5}, #}]] &,
Join[Thread[{Range[6], Range[6]}], Subsets[Range[6], {2}]]]

 

これで完成です。

<追記>2019.9.30

コードの例2

(以下の2つでも実行可能です。以下の2つの方が楽かもしれません)

Table[{2,5,a,b},{a,1,6},{b,1,6}]


Tuples[{{2}, {5}, Range[6], Range[6]}] 

(3)のコードはこちら

dataa = Flatten[Table[Sort[{2, 5, a, b}], {a, 1, 6}, {b, 1, 6}], 1]

dataa1 = Select[dataa, #[[2]] == 1 &]
dataa2 = Select[dataa, #[[2]] == 2 &]
dataa3 = Select[dataa, #[[2]] == 3 &]
dataa4 = Select[dataa, #[[2]] == 4 &]
dataa5 = Select[dataa, #[[2]] == 5 &]
dataa6 = Select[dataa, #[[2]] == 6 &]

Length[dataa1]
Length[dataa2]
Length[dataa3]
Length[dataa4]
Length[dataa5]
Length[dataa6]

(Lengthを上から2番目の式にくっつけたらもっと簡単なプログラムでできますが、後編の変形の都合上こうします。)

参考 

[?] Make a list of integers with the following pattern? - Online Technical Discussion Groups—Wolfram Community
Wolfram Community forum discussion about Make a list of integers with the following pattern?. Stay on top of important topics and build connections by joining ...

次回はこの問題の変形方法と変形例を紹介します。

コメント

タイトルとURLをコピーしました