@@ -101,7 +101,7 @@ int kpkProbe(int side, int wK, int wP, int bK)
101101
102102int kpkGenerate (void )
103103{
104- uint64_t legal [64 * 32 ];
104+ uint64_t valid [64 * 32 ];
105105
106106 // Prepare won
107107 for (int ix = 0 ; ix < arrayLen (kpkTable [0 ]); ix ++ ) {
@@ -115,45 +115,48 @@ int kpkGenerate(void)
115115 kpkTable [black ][ix ] = lost ;
116116 }
117117
118- if (inPawnZone (wP ) && wK != wP ) {
119- legal [ix ] = ~king64 (bit (wK ));
120- if (file (wP ) != fileA ) legal [ix ] &= ~bit (wP + N + W );
121- if (file (wP ) != fileH ) legal [ix ] &= ~bit (wP + N + E );
122- }
118+ valid [ix ] = ~king64 (bit (wK ));
119+ if (file (wP ) != fileA ) valid [ix ] &= ~bit (wP + N + W );
120+ if (file (wP ) != fileH ) valid [ix ] &= ~bit (wP + N + E );
123121 }
124122
125- uint64_t changed ;
123+ int changed ;
126124 do {
127- // White to move
128125 for (int ix = 0 ; ix < arrayLen (kpkTable [0 ]); ix ++ ) {
129126 int wK = wKsquare (ix ), wP = wPsquare (ix );
127+ if (!inPawnZone (wP ))
128+ continue ;
130129
131- // King moves
130+ // White king moves
132131 uint64_t won = 0 ;
133132 for (int i = 0 ; i < arrayLen (kingSteps ); i ++ ) {
134133 int to = wK + kingSteps [i ];
134+ int jx = ix + (kingSteps [i ] << 5 );
135135 if (taxi (wK , to & 63 ) == 1 && to != wP )
136- won |= kpkTable [black ][ix + ( kingSteps [ i ]<< 5 ) ] & ~king64 (bit (to ));
136+ won |= kpkTable [black ][jx ] & ~king64 (bit (to ));
137137 }
138- // Pawn moves
138+ // White pawn moves
139139 if (wP + N != wK ) {
140140 won |= kpkTable [black ][ix + rank2 - rank1 ] & ~bit (wP + N );
141141 if (rank (wP ) == rank2 && wP + N + N != wK )
142- won |= kpkTable [black ][ix + rank4 - rank2 ] & ~bit (wP + N ) & ~bit (wP + N + N );
142+ won |= kpkTable [black ][ix + rank4 - rank2 ]
143+ & ~bit (wP + N ) & ~bit (wP + N + N );
143144 }
144- kpkTable [white ][ix ] = won & legal [ ix ] ;
145+ kpkTable [white ][ix ] = won & ~ bit ( wP ) ;
145146 }
146147
147- // Black to move
148148 changed = 0 ;
149149 for (int ix = 0 ; ix < arrayLen (kpkTable [0 ]); ix ++ ) {
150- int wK = wKsquare (ix ), wP = wPsquare (ix );
150+ if (!inPawnZone (wPsquare (ix )))
151+ continue ;
151152
152- uint64_t canDraw = king64 (~kpkTable [white ][ix ]);
153- uint64_t hasMoves = king64 (legal [ix ]);
153+ // Black king moves
154+ uint64_t isBad = kpkTable [white ][ix ] | ~valid [ix ];
155+ uint64_t canDraw = king64 (~isBad );
156+ uint64_t hasMoves = king64 (valid [ix ]);
154157 uint64_t lost = hasMoves & ~canDraw ;
155158
156- changed |= kpkTable [black ][ix ] ^ lost ;
159+ changed += ( kpkTable [black ][ix ] != lost ) ;
157160 kpkTable [black ][ix ] = lost ;
158161 }
159162 } while (changed );
@@ -163,19 +166,20 @@ int kpkGenerate(void)
163166
164167int kpkSelfCheck (void )
165168{
166- int counts [] = { // As given by Steven J. Edwards (1996)
167- 163328 / 2 , 168024 / 2 , // legal positions for each side
168- 124960 / 2 , 97604 / 2 // nondraw positions for each side
169+ int counts [] = { // As given by Steven J. Edwards (1996):
170+ 163328 / 2 , 168024 / 2 , // - Legal positions per side
171+ 124960 / 2 , 97604 / 2 // - Non-draw positions per side
169172 };
170173 for (int ix = 0 ; ix < arrayLen (kpkTable [0 ]); ix ++ ) {
171174 int wK = wKsquare (ix ), wP = wPsquare (ix );
172- for (int bK = 0 ; bK < boardSize ; bK ++ )
173- if (inPawnZone (wP ) && !conflict (wK , wP , bK )) {
174- counts [0 ] -= !bInCheck (wK , wP , bK );
175- counts [1 ] -= !wInCheck (wK , wP , bK );
176- counts [2 ] -= !bInCheck (wK , wP , bK ) & (kpkTable [white ][ix ] >> bK );
177- counts [3 ] -= !wInCheck (wK , wP , bK ) & (kpkTable [black ][ix ] >> bK );
178- }
175+ for (int bK = 0 ; bK < boardSize ; bK ++ ) {
176+ if (!inPawnZone (wP ) || conflict (wK , wP , bK ))
177+ continue ;
178+ counts [0 ] -= !bInCheck (wK , wP , bK );
179+ counts [1 ] -= !wInCheck (wK , wP , bK );
180+ counts [2 ] -= !bInCheck (wK , wP , bK ) & (kpkTable [white ][ix ] >> bK );
181+ counts [3 ] -= !wInCheck (wK , wP , bK ) & (kpkTable [black ][ix ] >> bK );
182+ }
179183 }
180184 return !counts [0 ] && !counts [1 ] && !counts [2 ] && !counts [3 ];
181185}
0 commit comments