emath saloon

新規発言一覧最新記事過去一覧検索HOME

No.1491  互除法およびその逆算のソースを生成する
発言者: 田中徹
発言日: 2020 06/07 12:13
emath BBS No.13071 にある互除法およびその逆算の
align* 環境の部分のソースを生成するものです。
注意事項として
 ・write18 関係を使用しますのでタイプセットには -shell-escape オプションが必要です。
  (信頼できるソースとして扱っていただければ幸いです)
 ・補助ファイルとして ○○1.mdm ○○2.mdm という2つのテキストファイルを作成します。
  ○○ はファイル名で
   ○○1.mdm は 互除法部分を align* 環境で記述したもの
   ○○2.mdm は 上の逆算をを align* 環境で記述したもの
  です。(1行毎に番号付けがしてあるのが自慢です)

 この ○○1.mdm と ○○2.mdm を「取り込んで自由に編集可能とする」というのが
今回の目的です。

 最近,結構大きな数を係数とする1次不定方程式を相手にすることが多くなりました。
その度,13071を用いた結果を見ながら数式をもう一度タイプインするのが面倒になり,
このソースを作成しました。

 2つの変数を可変にしたいのなら,\typein で取得し,
そうでないなら \def 程度でタイプセットしていただければと思います。

皆様の教材作成に少しでもお役に立てれば幸いです。
 
\documentclass[a4j]{jarticle}
\usepackage[notMy]{emath}
\pagestyle{empty}

\def\不定方程式特殊解#1#2{

\hairetusyokika{A}
\hairetusyokika{B}
\hairetusyokika{Q}
\hairetusyokika{R}
\edef\ValA{#1}
\edef\ValB{#2}
\edef\Cnt{0}

\newwrite\MDMout
\immediate\openout\MDMout=\jobname1.mdm
\immediate\write\MDMout{%
\string \begin
{align*}
}%
%----------------------------配列を得るため互除法
\loop {\ifnum\ValB > 1}
\Addself\Cnt{1}
\hairetutuika{A}\ValA
\hairetutuika{B}\ValB
\IDivMod{\ValA}{\ValB}\WkQ\WkR

%\qquad
%$
%\ValA=\ValB\times{}\WkQ+\WkR \quad\cdots\:\maru{\Cnt}
%$

\immediate\write\MDMout{%
\ValA
&=
\ValB
\string \times{}
\WkQ
+
\WkR
\string \quad
\string \cdots
\string \:
\string \maru
{\Cnt}
\string \\
}%

\hairetutuika{Q}{\WkQ}
\hairetutuika{R}{\WkR}
\edef\ValA{\ValB}
\edef\ValB{\WkR}
\repeat

\immediate\write\MDMout{%
\string \end
{align*}
}%
\immediate\closeout\MDMout

%----------------------------------ここまで互除法

%-------------------------- 遡る
\def\GCD{1}
\edef\AnsX{1}
\edef\AnsY{-\hairetu{Q}{\Cnt}}

%\medskip
%\hrule
%\medskip


\newwrite\MDMout
\immediate\openout\MDMout=\jobname2.mdm
\immediate\write\MDMout{%
\string \begin
{align*}
}%


%\qquad${\GCD}=\hairetu{A}{\Cnt}-\hairetu{B}{\Cnt}\times\hairetu{Q}{\Cnt}$  \qquad $(\:\because\:\maru{\Cnt}\:)$

\immediate\write\MDMout{%
\GCD
&=
\hairetu{A}{\Cnt}
-
\hairetu{B}{\Cnt}
\string \times{}
\hairetu{Q}{\Cnt}
\string \qquad
(
\string \because
\string \maru
{\Cnt}
)
\string \\
}%


\loop{\ifnum\Cnt>1}
\ISub\Cnt{1}\DecCnt
\ifnum\AnsX>0
        \def\PrAnsX{\times{}\AnsX}
\else
        \def\PrAnsX{\times(\AnsX)}
\fi
\ifnum\AnsX=1\def\PrAnsX{\relax}\fi
\ifnum\AnsY>0
        \def\PrAnsY{\times{}\AnsY}
\else
        \def\PrAnsY{\times(\AnsY)}
\fi
\ifnum\AnsY=1\def\PrAnsY{\relax}\fi


%\qquad$\phantom{\GCD}=\hairetu{B}{\DecCnt}\PrAnsX+\hairetu{R}{\DecCnt}\PrAnsY$

%\qquad$\phantom{\GCD}=\hairetu{B}{\DecCnt}\PrAnsX+(\hairetu{A}{\DecCnt}-\hairetu{B}{\DecCnt}\times\hairetu{Q}{\DecCnt})\PrAnsY$ \qquad $(\:\because\:\maru{\DecCnt}\:)$

%%%%%%%%%%%%%%%%%%%%%%%%%%%
\immediate\write\MDMout{%
&=
\hairetu{B}{\DecCnt}\PrAnsX
+
\hairetu{R}{\DecCnt}\PrAnsY
\string \\
}
\immediate\write\MDMout{%
&=
\hairetu{B}{\DecCnt}\PrAnsX
+(
\hairetu{A}{\DecCnt}
-
\hairetu{B}{\DecCnt}
\string \times{}
\hairetu{Q}{\DecCnt})\PrAnsY
\string \qquad
(
\string \because
\string \maru
{\DecCnt}
)
\string \\
}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%



\edef\Dummy{\AnsX}
\edef\AnsX{\AnsY}
\IMul{-\hairetu{Q}{\DecCnt}}\AnsY\AnsY
\Addself\AnsY\Dummy

\Subself\Cnt{1}

\repeat
\ifnum\AnsX>0
        \def\PrAnsX{\times{}\AnsX}
\else
        \def\PrAnsX{\times(\AnsX)}
\fi
\ifnum\AnsX=1\def\PrAnsX{\relax}\fi
\ifnum\AnsY>0
        \def\PrAnsY{\times{}\AnsY}
\else
        \def\PrAnsY{\times(\AnsY)}
\fi
\ifnum\AnsY=1\def\PrAnsY{\relax}\fi

%\qquad$\phantom{\GCD}=\hairetu{A}{1}\PrAnsX+\hairetu{B}{1}\PrAnsY$
\immediate\write\MDMout{%
&=
\hairetu{A}{1}\PrAnsX
+
\hairetu{B}{1}\PrAnsY
}
\immediate\write\MDMout{%
\string \end
{align*}
}
\immediate\closeout\MDMout
}% End of 不定方程式特殊解の Define

\begin{document}

\typein[\VarA]{}
\typein[\VarB]{}

%\def\VarA{83}
%\def\VarB{32}

\不定方程式特殊解{\VarA}{\VarB}

\input{\jobname1.mdm}
\input{\jobname2.mdm}

\end{document}

▼関連発言

1491:互除法およびその逆算のソースを生成する [田中徹] 06/07 12:13<-last

  返信フォーム [引用]
名 前 保存
題 名
メール省略可
★この板では,投稿者が改行を入れない限り
 延々と右に続きます。適宜,改行を入れてください。
発 言
URL 省略可
PASSWORD
書き込む

Pass 保存


CGIROOM