GAIさんへのお返事です。
> カード52枚なら
> 2^n≡1(MOD53)
> なる最小のnが同順復元回数になっていた。
> また
> 2^n≡52 (MOD53)
> なる最小nが逆順復元回数を知らせる。
1回のシャッフルでカードkが現れる位置をf(k)は(カードkはf(k)番目にある)
f(k)=MOD(2*k,n+1)
と表せる。
m回シャッフルを繰り返すと
f(f(f(…(f(k)))))=2*(2*(2*…(2*k mod n+1) mod n+1) mod n+1) mod n+1=2^m*k mod n+1
一覧表をつくるプログラム
!リフルシャッフル
!n枚のカードを1,2,3,…,n-1,nに並べる。
!1回のシャッフルでカードkが現れる位置をf(k)と表す。(カードkはf(k)番目にある)
DEF f(k)=MOD(2*k,n+1)
FOR n=2 TO 100 STEP 2 !偶数
PRINT USING "### 枚:":n;
LET x=1 !カードxに着目
LET iter=1000
FOR m=1 TO iter !m回のシャッフル ※
LET x=f(x) !2^m*k (mod n+1)
!!!PRINT m;x
IF x=n THEN PRINT USING "### 回目で逆順、":m; !逆順
IF x=1 THEN EXIT FOR !もとに戻る
NEXT m
IF m>iter THEN
PRINT USING "### 回では元に戻りません。":m
ELSE
PRINT USING "### 回目に元に戻る":m
END IF
NEXT n
END
UBASICのmodinv関数を使った場合(サブルーチンは省略)
FOR n=2 TO 100 STEP 2 !偶数
PRINT USING "### 枚:":n;
LET iter=1000
FOR m=1 TO iter
LET x=modinv(2^m,n+1) !1枚目のカードの元の位置を得る
IF x=n THEN PRINT USING "### 回目で逆順、":m; !逆順
IF x=1 THEN EXIT FOR !もとに戻る
NEXT m
IF m>iter THEN
PRINT USING "### 回では元に戻りません。":m
ELSE
PRINT USING "### 回目に元に戻る":m
END IF
NEXT n
END