sasaharayuugo.net

ジュニア算数オリンピック 二次元上のユークリッド幾何の問題 その14

【随時更新】ユークリッド幾何学の定理や作図まとめ - ニート歴10年からの数学日記 を機械的に適用して、解答に至れるかを探る。今はこの自分で書いたプログラムを使っている。考察はユークリッド幾何学の原理についてのメモ - ニート歴10年からの数学日記ジュニア算数オリンピック04年度ファイナル問題6 辺の和について、三角形の検出について - ニート歴10年からの数学日記
 

 

06年度トライアル問題 問題9

『図の四角形ABCDはAB=BC=CDで、角B=168度、角C=108度です。角Dの大きさを求めなさい。


前回の続き。2ステップ目は長いんだが、気が済むまでやり続ける。

作図

以下5種類の作図をしていく。直接作図したもの以外に三角形や、あるいは正四角形や正五角形ができていたら、次の定理ループで角度が明らかになる可能性がある。


で前回は2ステップ目の、点と点を結んで線にする同士を試したんだった。今回は、点と点を結んで線にすると、それ以降の組み合わせを試していく。

前回の、ACを作図した時点での状態。

graph = {
        "A" : [
            [["B"], []],
            [["D"], []],
            [["C"], []]
        ]
        ,
        "B" : [
            [["A"], []],
            [["C"], []]
        ]
        ,
        "C" : [
            [["B"], []],
            [["D"], []],
            [["A"], []]
        ]
        ,
        "D" : [
            [["A"], []],
            [["C"], []]
        ]
    }

    angle_equ = {
        "ABC" : 0,
        168 : 0,
        "BCD" : 1,
        108 : 1
    }

    side_equ = {
        "AB" : 0,
        "BC" : 0,
        "CD" : 0
    }

    triangle_lst = {
        "ABC" : ["BAC", "AB", "ABC", "BC", "ACB", "AC"],
        "ACD" : ["CAD", "AC", "ACD", "CD", "ADC", "AD"]
    }

    sum_angle_lst = [
        ["BAC", "CAD", "BAD"],
        ["ACB", "ACD", "BCD"]
    ]

で、どの線の延長も、2ステップ目では三角形を生まないので、これは本当はスルーしたい。

1回ABをA側に延長してみる。するとこうなる。

graph = {
        "A" : [
            [["B"], ["E"]],
            [["D"], []],
            [["C"], []]
        ]
        ,
        "B" : [
            [["A", "E"], []],
            [["C"], []]
        ]
        ,
        "C" : [
            [["B"], []],
            [["D"], []],
            [["A"], []]
        ]
        ,
        "D" : [
            [["A"], []],
            [["C"], []]
        ]
        ,
        "E" : [
            [["A", "B"], []]
        ]
    }

    angle_equ = {
        "ABC" : 0,
        168 : 0,
        "BCD" : 1,
        108 : 1
    }

    side_equ = {
        "AB" : 0,
        "BC" : 0,
        "CD" : 0,
        "AE" : 0
    }

    triangle_lst = {
        "ABC" : ["BAC", "AB", "ABC", "BC", "ACB", "AC"],
        "ACD" : ["CAD", "AC", "ACD", "CD", "ADC", "AD"]
    }

    sum_angle_lst = [
        ["BAC", "CAD", "BAD"],
        ["ACB", "ACD", "BCD"]
    ]

それで、延長した辺上にある点、AとEを探して、三角形が発生していないか見ていく。当然新しく発生していないと分かる。それで、ようやくこのステップはキャンセルできる。

この流れによるキャンセルをこのACの作図と何らかの辺の延長の組み合わせの全てで行う。


次は、ACの作図と「2点と、その間の垂直線とどこか1辺の交点による、二等辺三角形の作図」の組み合わせ。
今回はどの辺も三角形に属しているのでやりやすい(いやABだけ考えてもそうでは無かった)。交点の判断はこの試行錯誤の核の一つだと思うが。

まず、最初のACの作図をもう一度貼る。特に自分にとって見やすくするために。

graph = {
        "A" : [
            [["B"], []],
            [["D"], []],
            [["C"], []]
        ]
        ,
        "B" : [
            [["A"], []],
            [["C"], []]
        ]
        ,
        "C" : [
            [["B"], []],
            [["D"], []],
            [["A"], []]
        ]
        ,
        "D" : [
            [["A"], []],
            [["C"], []]
        ]
    }

    angle_equ = {
        "ABC" : 0,
        168 : 0,
        "BCD" : 1,
        108 : 1
    }

    side_equ = {
        "AB" : 0,
        "BC" : 0,
        "CD" : 0
    }

    triangle_lst = {
        "ABC" : ["BAC", "AB", "ABC", "BC", "ACB", "AC"],
        "ACD" : ["CAD", "AC", "ACD", "CD", "ADC", "AD"]
    }

    sum_angle_lst = [
        ["BAC", "CAD", "BAD"],
        ["ACB", "ACD", "BCD"]
    ]


ABの垂直二等分線と交点を持つ辺を考えると、本当はACとADが引っかかるべきだ。
ACは三角形ABCに着目すれば良い。
ADは、本当は交わるのが決まっている。なぜならAとBとCとDの位置関係は、相似形ながら決まっているから。でもそういうのはおそらく、三角関数と俺が仮に呼んでいるものを使う必要がある。
もし、CDが長かったら、ADと交わらない場合もあり得る。と考えると、ADを伸ばしても四角形なわけだし、現在判明している角だけでの判断は難しいのではないか。BとDを繋いで判断する必要がある、がそれを今すべきかどうかのどちらか。まあ仮にしない方を選んでみる。


ABを底辺としたAC上への二等辺三角形の作図は、こうなる。

graph = {
        "A" : [
            [["B"], []],
            [["D"], []],
            [["C", "E"], []]    #ちょっと試しに、近い順じゃなくしてみる。そういう順番が分からない方が多いのではないか。それで問題が無ければそれが良い
        ]
        ,
        "B" : [
            [["A"], []],
            [["C"], []],
            [["E"], []]
        ]
        ,
        "C" : [
            [["B"], []],
            [["D"], []],
            [["A", "E"], []]
        ]
        ,
        "D" : [
            [["A"], []],
            [["C"], []]
        ]
        ,
        "E" : [
            [["A"], ["C"]]
        ]
    }

    angle_equ = {
        "ABC" : 0,
        168 : 0,
        "BCD" : 1,
        108 : 1,
        "BAE" : 2,
        "ABE" : 2
    }

    side_equ = {
        "AB" : 0,
        "BC" : 0,
        "CD" : 0,
        "AE" : 1,
        "BE" : 1
    }

    triangle_lst = {
        "ABC" : ["BAC", "AB", "ABC", "BC", "ACB", "AC"],
        "ACD" : ["CAD", "AC", "ACD", "CD", "ADC", "AD"]
    }

    sum_angle_lst = [
        ["BAC", "CAD", "BAD"],
        ["ACB", "ACD", "BCD"]
    ]

これで三角形を探すなり何なりする。
試行錯誤したいのは、交点の判断と、平行線関係と、sum_angle_lst関係。3番目がまだ残っているので、続けることにする。

まず三角形を探す。
ABEを発見。BCEを発見。まあ考えてみれば、追加した辺BEについて探せば良かったのか。

triangle_lst = {
        "ABC" : ["BAC", "AB", "ABC", "BC", "ACB", "AC"],
        "ACD" : ["CAD", "AC", "ACD", "CD", "ADC", "AD"],
        "ABE" : ["BAE", "AB", "ABE", "BE", "AEB", "AE"],    #今回は角を今までどおり記述するが、"A_[0][0]_[2][0]"という記述もアリだ。どう記述しても順番的に角BAEを表しているということは分かるわけだし。あるいはそれぞれの辺の[0]が変更されないようなら"BAC"でも良いかもしれない
        "BCE" : ["CBE", "BC", "BCE", "CE", "BEC", "BE"]
    }

次に対頂角と並行が発生しないことを確認する。

sum_angle_lstを追加した辺BE上の点、つまり点Bと点Eに着目して更新する。
点Bも点Eも辺を共有した三角形を2つ含み、四角形のクラスタをABCEと、その共有した辺BEを挟む形で形成するので、どちらの角の和も登録できると分かる(例えば四角形がABECだと、これは同じ方向に展開する角だと分かり、角の和としては登録してはいけない)。

sum_angle_lst = [
        ["BAC", "CAD", "BAD"],
        ["ACB", "ACD", "BCD"],
        ["ABE", "CBE", "ABC"],
        ["AEB", "BEC", 180]
    ]

graphに着目してsum_side_lstを更新する。点Eだけ見れば良い。

sum_side_lst = [
        ["AE", "CE", "AC"]
    ]

あとは三角形定理ループにかける感じかな。graphの内容自体は書き換わらない。次。


ACの二等分線は、まず三角形ABCだと点Bに交わるだろう、角度が同じなので。平行線は無いし、sum_angle_lstも同じ。

三角形ACDだと、その角Cが102°なので、残りがせいぜい78°という理由で、辺ADと交わる。まあこれも後はいろいろと同じだろう。


ADの二等分線は、三角形ACDだと、もしACがCDより長ければ、ACに交わると言えるのではないか。そして三角形ABCにおいて、もしそれぞれの辺の長さが同じだとしたら、角Bは60°で、それより大きいので、CDよりACが長いと言えるのではないか。

それをどうやって実装するかだがな。side_equ[0] < AC、なんていうのは。それが無理なら、比較はできないんで、どちらに交わるか分からずに、交点は考えないということになるだろう。とかで。

辺ABに交わるかも、三角形ABDで、同じように判断をすることが原理的には可能だろうが、とりあえず暫定的に判断しないことにしたんだっけか。

辺BCに交わるかが一番難しい。まあ、辺ABに交わらず、辺CDにも交わらないとなると、消去法でBCに交わることになるはずではあるんだがな。
このステップにおいては、どの辺と辺も、そういう確認方法が可能ではあるか。使うかはともかく。

それらにおける角の和でも、三角形を作図して、四角形にして共有する辺を挟むかを確認することができるかな?


BCの二等分線の作図。ABCではACに交わる。CDには108°なので交わらないので、ABとCDに交わらないという理由でADにも交わる。まあACへの作図を試しにやってみようか。

graph = {
        "A" : [
            [["B"], []],
            [["D"], []],
            [["C", "E"], []]
        ]
        ,
        "B" : [
            [["A"], []],
            [["C"], []],
            [["E"], []]
        ]
        ,
        "C" : [
            [["B"], []],
            [["D"], []],
            [["A", "E"], []]
        ]
        ,
        "D" : [
            [["A"], []],
            [["C"], []]
        ]
        ,
        "E" : [
            [["A"], ["C"]],
            [["B"], []]
        ]
    }

    angle_equ = {
        "ABC" : 0,
        168 : 0,
        "BCD" : 1,
        108 : 1,
        "CBE" : 2,
        "BCE" : 2
    }

    side_equ = {
        "AB" : 0,
        "BC" : 0,
        "CD" : 0,
        "BE" : 1,
        "CE" : 1
    }

    triangle_lst = {
        "ABC" : ["BAC", "AB", "ABC", "BC", "ACB", "AC"],
        "ACD" : ["CAD", "AC", "ACD", "CD", "ADC", "AD"]
    }

    sum_angle_lst = [
        ["BAC", "CAD", "BAD"],
        ["ACB", "ACD", "BCD"]
    ]

で、いやもう特に言うこと無いな。手なり。

ADに交わるかは、辺BDを作図する必要があって、でそういうことはしないと暫定的に決めたわけだし。

角の足し算とか引き算とかについても実装しなければいけないと今気付いた。三角形ABCで168°と他同じのが2角とかで。


CDの垂直二等分線。三角形ACDに着目すると、角Cは102°なので、辺ADに交わる。

graph = {
        "A" : [
            [["B"], []],
            [["D", "E"], []],
            [["C"], []]
        ]
        ,
        "B" : [
            [["A"], []],
            [["C"], []]
        ]
        ,
        "C" : [
            [["B"], []],
            [["D"], []],
            [["A"], []],
            [["E"], []]
        ]
        ,
        "D" : [
            [["A", "E"], []],
            [["C"], []]
        ]
        ,
        "E" : [
            [["A"], ["D"]]
        ]
    }

    angle_equ = {
        "ABC" : 0,
        168 : 0,
        "BCD" : 1,
        108 : 1,
        "DCE" : 2,
        "CDE" : 2
    }

    side_equ = {
        "AB" : 0,
        "BC" : 0,
        "CD" : 0,
        "CE" : 1,
        "DE" : 1
    }

    triangle_lst = {
        "ABC" : ["BAC", "AB", "ABC", "BC", "ACB", "AC"],
        "ACD" : ["CAD", "AC", "ACD", "CD", "ADC", "AD"]
    }

    sum_angle_lst = [
        ["BAC", "CAD", "BAD"],
        ["ACB", "ACD", "BCD"]
    ]

まあ後は手なりじゃないか。それから三角形定理ループ。


次は、ACの作図と、「ある1辺と同じ長さの辺を別の辺に落とすことによる二等辺三角形の作図」の組み合わせ。

まずACの作図をそのまま載せておく。

graph = {
        "A" : [
            [["B"], []],
            [["D"], []],
            [["C"], []]
        ]
        ,
        "B" : [
            [["A"], []],
            [["C"], []]
        ]
        ,
        "C" : [
            [["B"], []],
            [["D"], []],
            [["A"], []]
        ]
        ,
        "D" : [
            [["A"], []],
            [["C"], []]
        ]
    }

    angle_equ = {
        "ABC" : 0,
        168 : 0,
        "BCD" : 1,
        108 : 1
    }

    side_equ = {
        "AB" : 0,
        "BC" : 0,
        "CD" : 0
    }

    triangle_lst = {
        "ABC" : ["BAC", "AB", "ABC", "BC", "ACB", "AC"],
        "ACD" : ["CAD", "AC", "ACD", "CD", "ADC", "AD"]
    }

    sum_angle_lst = [
        ["BAC", "CAD", "BAD"],
        ["ACB", "ACD", "BCD"]
    ]

ABと同じ長さの辺をAD上に落とすというのがあり得る。また逆にAからBCに作図するという場合があり得るはずだが、その場合は168°が2つになるので無理。
次のBCは、BからCDに落とすというのがあり得るが、これも108°が2つになるので無理。
CDのDからの、BCに落とすというのも同じ理由で無理で、ACに落とすのも102°が2つになるので無理。CからADは可能だろう。
ADの場合の、AからCDと、DからABは可能なんだろうか。


まずABと同じ長さの辺をAD上に。

graph = {
        "A" : [
            [["B"], []],
            [["D", "E"], []],
            [["C"], []]
        ]
        ,
        "B" : [
            [["A"], []],
            [["C"], []],
            [["E"], []]
        ]
        ,
        "C" : [
            [["B"], []],
            [["D"], []],
            [["A"], []]
        ]
        ,
        "D" : [
            [["A", "E"], []],
            [["C"], []]
        ]
        ,
        "E" : [
            [["A"], ["D"]],
            [["B"], []]
        ]
    }

    angle_equ = {
        "ABC" : 0,
        168 : 0,
        "BCD" : 1,
        108 : 1,
        "BAE" : 2,
        "BEA" : 2
    }

    side_equ = {
        "AB" : 0,
        "BC" : 0,
        "CD" : 0,
        "BE" : 0
    }

    triangle_lst = {
        "ABC" : ["BAC", "AB", "ABC", "BC", "ACB", "AC"],
        "ACD" : ["CAD", "AC", "ACD", "CD", "ADC", "AD"]
    }

    sum_angle_lst = [
        ["BAC", "CAD", "BAD"],
        ["ACB", "ACD", "BCD"]
    ]

まあ、うん。並行は無いし、角の和も、まあ。

とか言ってたらやることが無いからな。並行が出る作図を探すか。まあいつか出てくると思うけども。


ADをCDとかABに下ろすのはどうなんだろう。一番端のACとかBDがADより短いものは、それよりAD側に寄せてもADの長さに近づいていってADで一致するだけだから、無理なんじゃないかという気はする。
ACは下の角が102°だから、ADの方が長い、つまりACの方が短いから無理。
BDもきっとそうなんだろうけどなあ。というかそもそも、そういう長さ確認をABとかCDでもすべきだったかな。まあ分からない場合は作図せずで良いんじゃないかな。