質問<264>2000/5/29
from=金子
「プログラムと反射問題」


金子というHNで投稿させていただいたものですが
自分も問い2(2)を考えてみて・・・最終的にこういうプログラムを立てた
のですが減点対象になるでしょうか?
void main(void) 
{ int x1,x2,x3,s=0; 
for(x1=1;x1<=13;x1++){ 
for(x2=1;x2<=13;x2++){ 
for(x3=1;x3<=13;x3++){ 
if((x1*x2+x2*x3+x3*x1)%13==1) s++; 
} } } 
printf("s = %d",s); } 

実行結果 
s = 182 
やはり解答としてはふさわしくないですよね(^^;

あともう1問わからないものがあるので(一体いくつあるんだ!!)、ここに
書いても宜しいでしょうか?
[問題A]
一辺の長さが1の正四面体OABCがあり、
OA(ベクトル)=a(ベクトル)
OB(ベクトル)=b(ベクトル)
OC(ベクトル)=c(ベクトル)とおく。
四面体OABCの内部では直進し、四面体の各面で反射の法則にしたがって
反射する点Pがある。PがOをスタートし、一回目は⊿ABCの内部(辺上
の点は除く)で反射し、二回目は⊿OAB.⊿OBC.⊿OCAの内部(辺
上の点は除く)のいずれかで反射した後、3回目にぶつかったところで止ま
るものとする。
このとき⊿OAB上の点で三回目にPが到達できる部分を図示せよ


お返事2000/5/30
from=武田


c言語によるプログラムは大変良いと思います。
しかし、テストとなると、ダメでしょうね。
私としてはプログラム点をあげたいですね。

[問題A]
これも難問です。未解決問題のコーナーに移しました。
そのあとすぐ質問者(金子さん)から解答が分かった旨連絡と解答が寄せら
れたので、次にお便りを掲載します。


お便り2000/6/1
from=金子


金子です。
未解決問題の一番目、ベクトルの問題は考えた結果とくことができました。
ここに概要を書かせていただきます。
「反射」ときたら、同じ図をくっつけて真っ直ぐ通過させる。これは平面図形
でよく使う手法で立体でも同じである。


 まず、⊿ABCの内部で反射するということは、上の図の四面体O'ABC
の内部へ直進していくのと同じこと。2回目の反射も同様。四面体O'ABC
を通り過ぎて四面体O'A'BC、四面体O'AB'C、四面体O'ABC'のどれ
かの内部へと直進して行くことになる。

 したがって、本問は「⊿OAB上の点で三回目にPが到達できる部分」を探
す問題を、実際は「Oを出発点とし、⊿ABCの内部を通過する直線が
⊿OA'B or ⊿OAB'に到達する部分」を探す問題と書き換える。


 正四面体OABCの各辺を2倍に拡大した四面体OXYZを書き足した。(※ 2倍じ
ゃなくてもOK。)なお、点Dは辺BCの中点、点Eは線分ODの延長線と
O'A'の交点。

 一回目は⊿ABCの内部を通過するはずだから、その直線は四面体OXYZの外
には出ない。しかし、上の図を見れば分かるように、四面体O'A'BCには四面体
OXYZの外に出ている部分が存在する。つまり、そこが直線の到達しない部分と
いうこと。(※ 四面体O'AB'Cについても同様なため、説明は省略。)

次に点Eについて、
 ベクトルOO'、ベクトルOA'、ベクトルODをそれぞれa(ベクトル)、
b(ベクトル)、c(ベクトル)を使って表す。(以下「ベクトル」省略)

 OEをOO'、OA'、ODを使って2通りの方法で表す。
(例 OE=tOA'+(1-t)OO'  OE=sOD)

それに1でだした答えを代入する。
2つの式の係数を比較すれば完了。
 これでO'E : EA'=6 : 5 になるのであとはそれを⊿OAB上に
図示すればよい。


したがって図の緑色の部分(赤い線とOは含まず)……(おわり)