可変個の集合から、直積の集合を作る(その4)

見当違いなこと言ってた。

無限リストを有限リストに小分けしていくというアプローチで解決してみようと思っているところ。

可変個の集合から、直積の集合を作る(その3) - チキン煮込みチーズミックス4辛

偶数の集合\mathbb{A}= \{ x \mid x=2n, n \in \mathbb{N}\}と奇数の集合\mathbb{B}= \{x \mid x=2n+1, n \in \mathbb{N}\}の直積を考えるとき、例えば\mathbb{A}\mathbb{B}の要素を3個ずつに区切った部分集合を作って、\mathbb{A}=\mathbb{A}_0 \cup \mathbb{A}_1 \cup \mathbb{A}_2 \cup \dots\mathbb{B}=\mathbb{B}_0 \cup \mathbb{B}_1 \cup \mathbb{B}_2 \cup \dotsとしといて、

  • \mathbb{A}_0\mathbb{B}_0の直積:(0,1),(0,3)(0,5),(2,1),...
  • \mathbb{A}_0\mathbb{B}_1の直積:(0,7),(0,9),(0,11),(2,7),...
  • \mathbb{A}_0\mathbb{B}_2の直積:(0,13),(0,15),(0,17),(2,13),...
  • 以下略

とかしてみようとか思ってたら、結局\mathbb{A}_1とのペアには永遠に来ないわけですなぁ。全く解決になってない!ってことで数学は良く分からないけど、ない頭で別の解決策を考えてみた。

集合\mathbb{A}\mathbb{B}から生成される直積の集合を、行列みたいに書くと
\mathbb{P}= \left \{ \begin{array}{r,r,r,r,r,r,r,r,r} p_{00} &,& p_{01} &,& p_{02} &,& p_{03} &,& \dots\\ p_{10} &,& p_{11} &,& p_{12} &,& p_{13} &,& \dots\\ p_{20} &,& p_{21} &,& p_{22} &,& p_{23} &,& \dots\\ p_{30} &,& p_{31} &,& p_{32} &,& p_{33} &,& \dots\\ \vdots && \vdots && \vdots && \vdots && \ddots \end{array} \right \}
みたいにかける。ただし、p_{01} = (0,3)p_{10}=(2,1)、...、つまりp_{i,j}=(2i,2j+1),i \in \mathbb{N}, j \in \mathbb{N}
1行(または1列)全て列挙した後に次の行(または列)を処理していては永遠に次の行(または列)へ移れないのが困る。ということで、
p_{00}p_{01}p_{11}p_{10}p_{20}p_{21}p_{22}p_{12}p_{02}p_{03}p_{13}p_{23}p_{33}p_{32}p_{31}p_{30}→...って列挙すれば良いような気がする。こんな感じ。

こういう動きをするイテレータを作ってあげればいいのかな。でも無限リストが3つ以上の場合に一般化するのは難しそうだなぁ。
頭の体操になるなー。