射影平面$p²+p+1$とアフィン平面$p²$の同時列挙方法
p=3の場合を例として説明いたします。
p=3の射影平面の図(0〜12を1〜13に変えてます。)
対称性のあるp=3の射影平面の図
javascriptで書いてみました。
pに好きな素数を入力すればそれに対応したブロックデザインが出来ます。
プログラミングは超初心者なので所々でツッコミたいと思いますが軽ーい気持ちで見てください。
webで実際に体験してみて下さい
pを選んで射影平面とアフィン平面ボタンを押せば表示します。
位数は素数の累乗であれば可能なのですが、アルゴリズムにするとバックトラッキング法などで既にsagemath等で存在しますが、ある程度の知識が無いと自分みたいな初心者では難しいです。射影平面の標準構成ではまず使わないモノを沢山使ってめちゃくちゃクセ強になりました。
const p = 3
const q = p**2+p+1
const array=[ ]
for (let num = 0; num < q; num++) {
array.push(num);
}
const array1=[]
for(let i=1;i<=p;i++){
array1[i-1]=array.filter((value)=>{
if(p(i+1) >= value && pi < value){
return value;
}
});
};
const array0=[];
const afine=[ ];
for (let num = 1; num < q; num+=p) {
const u = function(u){
return array[num+u]
}
const l = function(u){
return array[num+u]-p-1
}
const datan = [0];
const dataa = [];
for(let h = 0; h < p; h++) {
datan[h+1]=u(h);
dataa[h]=l(h);
}//↓射影平面
array0.push(datan); //0とu(p-1)までを格納する
//↓アフィン平面
afine.push(dataa); //l(p-1)までを格納する
}
for(let i = 0; i < p; i++){
for (let num = 0; num < p; num++) {
const n = function(n){ //射影平面のアフィン平面部分に使用する関数
return array1[n][(num+i*n)%array1[n].length]
};
const a = function(n){ //アフィン平面に使用する関数
return array1[n][(num+i*n)%array1[n].length]-p-1
};
const ndata = [array[i+1]];
const adata = [];
for(let h = 0; h < p; h++) {
//↓射影平面
ndata[h+1]=n(h);
//↓アフィン平面
adata[h]=a(h);
}
array0.push(ndata); //[array[i+1]とn(p-1)までを格納する
afine.push(adata); //a(p-1)までを格納する
afine[0]='';
}};
console.log(array0);
console.log(afine);