diff --git a/Java/Bitboard.java b/Java/Bitboard.java new file mode 100644 index 0000000..318b1f5 --- /dev/null +++ b/Java/Bitboard.java @@ -0,0 +1,48 @@ +import java.math.BigInteger; + +public class Bitboard +{ + + public static BigInteger addBit(BigInteger bitboard, int square) + { + return bitboard.setBit(square); + } + + public static void printBigInteger(BigInteger bitboard) + { + for (int rank = 0; rank < 8; rank++) + { + for (int file = 0; file < 8; file++) + { + int square = rank * 8 + file; + processSquare(bitboard, square); + } + System.out.println(); + } + System.out.println("BigInteger: " + bitboard); + } + + static void processSquare(BigInteger bitboard, int square) + { + if (bitboard.testBit(square)) + { + System.out.print("X "); + } + else + { + System.out.print("_ "); + } + } + + static int bitScanForwardSlow(BigInteger bitboard) + { + for (int i = 0; i < 64; i++) + { + if (bitboard.testBit(i)) + { + return i; + } + } + return -1; + } +} diff --git a/Java/Board.java b/Java/Board.java new file mode 100644 index 0000000..5523df2 --- /dev/null +++ b/Java/Board.java @@ -0,0 +1,121 @@ + +import java.math.BigInteger; + +public class Board +{ + public static BigInteger[] bitboard_array_global = new BigInteger[12]; + public static boolean is_white_global = true; + public static boolean[] castle_rights_global = new boolean[4]; + public static int ep; + + static final BigInteger BP_STARTING_POSITIONS = new BigInteger("65280"); + static final BigInteger WP_STARTING_POSITIONS = new BigInteger("71776119061217280"); + static final BigInteger BK_STARTING_POSITION = new BigInteger("16"); + static final BigInteger WK_STARTING_POSITION = new BigInteger("1152921504606846976"); + static final BigInteger BN_STARTING_POSITIONS = new BigInteger("66"); + static final BigInteger WN_STARTING_POSITIONS = new BigInteger("4755801206503243776"); + static final BigInteger WR_STARTING_POSITIONS = new BigInteger("9295429630892703744"); + static final BigInteger BR_STARTING_POSITIONS = new BigInteger("129"); + static final BigInteger BB_STARTING_POSITIONS = new BigInteger("36"); + static final BigInteger WB_STARTING_POSITIONS = new BigInteger("2594073385365405696"); + static final BigInteger WQ_STARTING_POSITION = new BigInteger("576460752303423488"); + static final BigInteger BQ_STARTING_POSITION = new BigInteger("8"); + + + public static void SetTrickyPosition() { + + ep = GenConst.NO_SQUARE; + is_white_global = true; + castle_rights_global[0] = true; + castle_rights_global[1] = true; + castle_rights_global[2] = true; + castle_rights_global[3] = true; + + bitboard_array_global[GenConst.WP] = new BigInteger("65020788473856000"); + bitboard_array_global[GenConst.WN] = new BigInteger("4398314946560"); + bitboard_array_global[GenConst.WB] = new BigInteger("6755399441055744"); + bitboard_array_global[GenConst.WR] = new BigInteger("9295429630892703744"); + bitboard_array_global[GenConst.WQ] = new BigInteger("35184372088832"); + bitboard_array_global[GenConst.WK] = new BigInteger("1152921504606846976"); + bitboard_array_global[GenConst.BP] = new BigInteger("140746083544320"); + bitboard_array_global[GenConst.BN] = new BigInteger("2228224"); + bitboard_array_global[GenConst.BB] = new BigInteger("81920"); + bitboard_array_global[GenConst.BR] = new BigInteger("129"); + bitboard_array_global[GenConst.BQ] = new BigInteger("4096"); + bitboard_array_global[GenConst.BK] = new BigInteger("16"); + } + + public static void SetStartingPosition() { + + ep = GenConst.NO_SQUARE; + is_white_global = true; + castle_rights_global[0] = true; + castle_rights_global[1] = true; + castle_rights_global[2] = true; + castle_rights_global[3] = true; + + bitboard_array_global[GenConst.WP] = WP_STARTING_POSITIONS; + bitboard_array_global[GenConst.WN] = WN_STARTING_POSITIONS; + bitboard_array_global[GenConst.WB] = WB_STARTING_POSITIONS; + bitboard_array_global[GenConst.WR] = WR_STARTING_POSITIONS; + bitboard_array_global[GenConst.WQ] = WQ_STARTING_POSITION; + bitboard_array_global[GenConst.WK] = WK_STARTING_POSITION; + bitboard_array_global[GenConst.BP] = BP_STARTING_POSITIONS; + bitboard_array_global[GenConst.BN] = BN_STARTING_POSITIONS; + bitboard_array_global[GenConst.BB] = BB_STARTING_POSITIONS; + bitboard_array_global[GenConst.BR] = BR_STARTING_POSITIONS; + bitboard_array_global[GenConst.BQ] = BQ_STARTING_POSITION; + bitboard_array_global[GenConst.BK] = BK_STARTING_POSITION; + } + + static final char[] PieceNames = {'P', 'N', 'B', 'R', 'Q', 'K', 'P', 'N', 'B', 'R', 'Q', 'K', '_'}; + static final char[] PieceColours = {'W', 'W', 'W', 'W', 'W', 'W', 'B', 'B', 'B', 'B', 'B', 'B', '_'}; + +static final int EMPTY = 12; + + static boolean IsOccupied(BigInteger bitboard, int square) { + return !bitboard.and(MoveConstants.SQUARE_BBS[square]).equals(BigInteger.ZERO); + } + + static int GetOccupiedIndex(int square) { + for (int i = 0; i < 12; i++) { + if (IsOccupied(bitboard_array_global[i], square)) { + return i; + } + } + return EMPTY; + } + + static int[] fillBoardArray() { + int[] boardArray = new int[64]; + for (int i = 0; i < 64; i++) { + boardArray[i] = GetOccupiedIndex(i); + } + return boardArray; + } + + public static void PrintBoard() { + System.out.println("Board:"); + + int[] boardArray = fillBoardArray(); + + for (int rank = 0; rank < 8; rank++) { + System.out.print(" "); + + for (int file = 0; file < 8; file++) { + int square = (rank * 8) + file; + System.out.printf("%c%c ", PieceColours[boardArray[square]], PieceNames[boardArray[square]]); + } + + System.out.println(); + } + System.out.println(); + + System.out.printf("White to play: %b\n", is_white_global); + System.out.printf("Castle: %b %b %b %b\n", castle_rights_global[0], castle_rights_global[1], castle_rights_global[2], castle_rights_global[3]); + System.out.printf("ep: %d\n", ep); + System.out.println(); + System.out.println(); + } + +} diff --git a/Java/ChessEngine.java b/Java/ChessEngine.java index 384686c..530a9c9 100644 --- a/Java/ChessEngine.java +++ b/Java/ChessEngine.java @@ -1,13 +1,13 @@ - -public class ChessEngine -{ - public static void main(String[] args) - { - //Testing.testRookMoves(); - Board.SetTrickyPosition(); - //Board.SetStartingPosition(); - Board.PrintBoard(); - Perft.RunPerftInlineGlobalOcc(2); - //Board.PrintBoard(); - } -} + +public class ChessEngine +{ + public static void main(String[] args) + { + //Testing.testRookMoves(); + Board.SetTrickyPosition(); + //Board.SetStartingPosition(); + Board.PrintBoard(); + Perft.RunPerftInlineGlobalOcc(2); + //Board.PrintBoard(); + } +} \ No newline at end of file diff --git a/Java/GenConst.java b/Java/GenConst.java new file mode 100644 index 0000000..aa1833a --- /dev/null +++ b/Java/GenConst.java @@ -0,0 +1,136 @@ +public class GenConst { + public static final int WP = 0; + public static final int WN = 1; + public static final int WB = 2; + public static final int WR = 3; + public static final int WQ = 4; + public static final int WK = 5; + public static final int BP = 6; + public static final int BN = 7; + public static final int BB = 8; + public static final int BR = 9; + public static final int BQ = 10; + public static final int BK = 11; + public static final int EMPTY = 12; + + public static final int TAG_NONE = 0; +public static final int TAG_CAPTURE = 1; +public static final int TAG_WHITEEP = 2; +public static final int TAG_BLACKEP = 3; +public static final int TAG_WCASTLEKS = 4; +public static final int TAG_WCASTLEQS = 5; +public static final int TAG_BCASTLEKS = 6; +public static final int TAG_BCASTLEQS = 7; +public static final int TAG_BKnightPromotion = 8; +public static final int TAG_BBishopPromotion = 9; +public static final int TAG_BQueenPromotion = 10; +public static final int TAG_BRookPromotion = 11; +public static final int TAG_WKnightPromotion = 12; +public static final int TAG_WBishopPromotion = 13; +public static final int TAG_WQueenPromotion = 14; +public static final int TAG_WRookPromotion = 15; +public static final int TAG_BCaptureKnightPromotion = 16; +public static final int TAG_BCaptureBishopPromotion = 17; +public static final int TAG_BCaptureQueenPromotion = 18; +public static final int TAG_BCaptureRookPromotion = 19; +public static final int TAG_WCaptureKnightPromotion = 20; +public static final int TAG_WCaptureBishopPromotion = 21; +public static final int TAG_WCaptureQueenPromotion = 22; +public static final int TAG_WCaptureRookPromotion = 23; +public static final int TAG_DoublePawnWhite = 24; +public static final int TAG_DoublePawnBlack = 25; +public static final int TAG_CHECK = 26; +public static final int TAG_CHECK_CAPTURE = 27; + +public static final int A8 = 0; +public static final int B8 = 1; +public static final int C8 = 2; +public static final int D8 = 3; +public static final int E8 = 4; +public static final int F8 = 5; +public static final int G8 = 6; +public static final int H8 = 7; +public static final int A7 = 8; +public static final int B7 = 9; +public static final int C7 = 10; +public static final int D7 = 11; +public static final int E7 = 12; +public static final int F7 = 13; +public static final int G7 = 14; +public static final int H7 = 15; +public static final int A6 = 16; +public static final int B6 = 17; +public static final int C6 = 18; +public static final int D6 = 19; +public static final int E6 = 20; +public static final int F6 = 21; +public static final int G6 = 22; +public static final int H6 = 23; +public static final int A5 = 24; +public static final int B5 = 25; +public static final int C5 = 26; +public static final int D5 = 27; +public static final int E5 = 28; +public static final int F5 = 29; +public static final int G5 = 30; +public static final int H5 = 31; +public static final int A4 = 32; +public static final int B4 = 33; +public static final int C4 = 34; +public static final int D4 = 35; +public static final int E4 = 36; +public static final int F4 = 37; +public static final int G4 = 38; +public static final int H4 = 39; +public static final int A3 = 40; +public static final int B3 = 41; +public static final int C3 = 42; +public static final int D3 = 43; +public static final int E3 = 44; +public static final int F3 = 45; +public static final int G3 = 46; +public static final int H3 = 47; +public static final int A2 = 48; +public static final int B2 = 49; +public static final int C2 = 50; +public static final int D2 = 51; +public static final int E2 = 52; +public static final int F2 = 53; +public static final int G2 = 54; +public static final int H2 = 55; +public static final int A1 = 56; +public static final int B1 = 57; +public static final int C1 = 58; +public static final int D1 = 59; +public static final int E1 = 60; +public static final int F1 = 61; +public static final int G1 = 62; +public static final int H1 = 63; + +public static final int NO_SQUARE = 64; + +static char[] SQ_CHAR_Y = { + '8', '8', '8', '8', '8', '8', '8', '8', + '7', '7', '7', '7', '7', '7', '7', '7', + '6', '6', '6', '6', '6', '6', '6', '6', + '5', '5', '5', '5', '5', '5', '5', '5', + '4', '4', '4', '4', '4', '4', '4', '4', + '3', '3', '3', '3', '3', '3', '3', '3', + '2', '2', '2', '2', '2', '2', '2', '2', + '1', '1', '1', '1', '1', '1', '1', '1', + 'A' // This seems like an extra value; ensure it is intentional +}; + +static char[] SQ_CHAR_X = { + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', + 'N' // This seems like an extra value; ensure it is intentional +}; + +} diff --git a/Java/Inb.java b/Java/Inb.java new file mode 100644 index 0000000..2111d62 --- /dev/null +++ b/Java/Inb.java @@ -0,0 +1,4232 @@ +import java.math.BigInteger; + +public class Inb +{ + public static final BigInteger[][] INBETWEEN_BITBOARDS = +{ + { + new BigInteger("0"), + new BigInteger("2"), + new BigInteger("6"), + new BigInteger("14"), + new BigInteger("30"), + new BigInteger("62"), + new BigInteger("126"), + new BigInteger("254"), + new BigInteger("256"), + new BigInteger("512"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("65792"), + new BigInteger("0"), + new BigInteger("262656"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("16843008"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("134480384"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4311810304"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("68853957120"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1103823438080"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("35253226045952"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("282578800148736"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("18049651735527936"), + new BigInteger("0"), + new BigInteger("72340172838076672"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9241421688590303744"), + }, + { + new BigInteger("1"), + new BigInteger("0"), + new BigInteger("4"), + new BigInteger("12"), + new BigInteger("28"), + new BigInteger("60"), + new BigInteger("124"), + new BigInteger("252"), + new BigInteger("256"), + new BigInteger("512"), + new BigInteger("1024"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("131584"), + new BigInteger("0"), + new BigInteger("525312"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("33686016"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("268960768"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8623620608"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("137707914240"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2207646876160"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("70506452091904"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("565157600297472"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("36099303471055872"), + new BigInteger("0"), + new BigInteger("144680345676153344"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("3"), + new BigInteger("2"), + new BigInteger("0"), + new BigInteger("8"), + new BigInteger("24"), + new BigInteger("56"), + new BigInteger("120"), + new BigInteger("248"), + new BigInteger("0"), + new BigInteger("512"), + new BigInteger("1024"), + new BigInteger("2048"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("66048"), + new BigInteger("0"), + new BigInteger("263168"), + new BigInteger("0"), + new BigInteger("1050624"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("67372032"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("537921536"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17247241216"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("275415828480"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4415293752320"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("141012904183808"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1130315200594944"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("289360691352306688"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("7"), + new BigInteger("6"), + new BigInteger("4"), + new BigInteger("0"), + new BigInteger("16"), + new BigInteger("48"), + new BigInteger("112"), + new BigInteger("240"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1024"), + new BigInteger("2048"), + new BigInteger("4096"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("132096"), + new BigInteger("0"), + new BigInteger("526336"), + new BigInteger("0"), + new BigInteger("2101248"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("16909312"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("134744064"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1075843072"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("34494482432"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("550831656960"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8830587504640"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2260630401189888"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("578721382704613376"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("15"), + new BigInteger("14"), + new BigInteger("12"), + new BigInteger("8"), + new BigInteger("0"), + new BigInteger("32"), + new BigInteger("96"), + new BigInteger("224"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2048"), + new BigInteger("4096"), + new BigInteger("8192"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("264192"), + new BigInteger("0"), + new BigInteger("1052672"), + new BigInteger("0"), + new BigInteger("4202496"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("33818624"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("269488128"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2151686144"), + new BigInteger("4328785920"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("68988964864"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17661175009280"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4521260802379776"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1157442765409226752"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("31"), + new BigInteger("30"), + new BigInteger("28"), + new BigInteger("24"), + new BigInteger("16"), + new BigInteger("0"), + new BigInteger("64"), + new BigInteger("192"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4096"), + new BigInteger("8192"), + new BigInteger("16384"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("528384"), + new BigInteger("0"), + new BigInteger("2105344"), + new BigInteger("0"), + new BigInteger("8404992"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("67637248"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("538976256"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8657571840"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("137977929728"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1108169199616"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("35322350018560"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9042521604759552"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2314885530818453504"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("63"), + new BigInteger("62"), + new BigInteger("60"), + new BigInteger("56"), + new BigInteger("48"), + new BigInteger("32"), + new BigInteger("0"), + new BigInteger("128"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8192"), + new BigInteger("16384"), + new BigInteger("32768"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1056768"), + new BigInteger("0"), + new BigInteger("4210688"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("135274496"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1077952512"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17315143680"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("275955859456"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2216338399232"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("70644700037120"), + new BigInteger("0"), + new BigInteger("283691315109888"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("18085043209519104"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4629771061636907008"), + new BigInteger("0"), + }, + { + new BigInteger("127"), + new BigInteger("126"), + new BigInteger("124"), + new BigInteger("120"), + new BigInteger("112"), + new BigInteger("96"), + new BigInteger("64"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("16384"), + new BigInteger("32768"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2113536"), + new BigInteger("0"), + new BigInteger("8421376"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("270548992"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2155905024"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("34630287360"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("551911718912"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4432676798464"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("141289400074240"), + new BigInteger("0"), + new BigInteger("567382630219776"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("36170086419038208"), + new BigInteger("72624976668147712"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9259542123273814016"), + }, + { + new BigInteger("1"), + new BigInteger("2"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("512"), + new BigInteger("1536"), + new BigInteger("3584"), + new BigInteger("7680"), + new BigInteger("15872"), + new BigInteger("32256"), + new BigInteger("65024"), + new BigInteger("65536"), + new BigInteger("131072"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("16842752"), + new BigInteger("0"), + new BigInteger("67239936"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4311810048"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("34426978304"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1103823437824"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17626613022720"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("282578800148480"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9024825867763712"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("72340172838076416"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4620710844295151616"), + new BigInteger("0"), + }, + { + new BigInteger("1"), + new BigInteger("2"), + new BigInteger("4"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("256"), + new BigInteger("0"), + new BigInteger("1024"), + new BigInteger("3072"), + new BigInteger("7168"), + new BigInteger("15360"), + new BigInteger("31744"), + new BigInteger("64512"), + new BigInteger("65536"), + new BigInteger("131072"), + new BigInteger("262144"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("33685504"), + new BigInteger("0"), + new BigInteger("134479872"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8623620096"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("68853956608"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2207646875648"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("35253226045440"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("565157600296960"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("18049651735527424"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("144680345676152832"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9241421688590303232"), + }, + { + new BigInteger("0"), + new BigInteger("2"), + new BigInteger("4"), + new BigInteger("8"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("768"), + new BigInteger("512"), + new BigInteger("0"), + new BigInteger("2048"), + new BigInteger("6144"), + new BigInteger("14336"), + new BigInteger("30720"), + new BigInteger("63488"), + new BigInteger("0"), + new BigInteger("131072"), + new BigInteger("262144"), + new BigInteger("524288"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("16908288"), + new BigInteger("0"), + new BigInteger("67371008"), + new BigInteger("0"), + new BigInteger("268959744"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17247240192"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("137707913216"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4415293751296"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("70506452090880"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1130315200593920"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("36099303471054848"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("289360691352305664"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("36099303471054849"), + new BigInteger("0"), + new BigInteger("4"), + new BigInteger("8"), + new BigInteger("16"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1792"), + new BigInteger("1536"), + new BigInteger("1024"), + new BigInteger("0"), + new BigInteger("4096"), + new BigInteger("12288"), + new BigInteger("28672"), + new BigInteger("61440"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("262144"), + new BigInteger("524288"), + new BigInteger("1048576"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("33816576"), + new BigInteger("0"), + new BigInteger("134742016"), + new BigInteger("0"), + new BigInteger("537919488"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4328783872"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("34494480384"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("275415826432"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8830587502592"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("141012904181760"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2260630401187840"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("578721382704611328"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8"), + new BigInteger("16"), + new BigInteger("32"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("3840"), + new BigInteger("3584"), + new BigInteger("3072"), + new BigInteger("2048"), + new BigInteger("0"), + new BigInteger("8192"), + new BigInteger("24576"), + new BigInteger("57344"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("524288"), + new BigInteger("1048576"), + new BigInteger("2097152"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("67633152"), + new BigInteger("0"), + new BigInteger("269484032"), + new BigInteger("0"), + new BigInteger("1075838976"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8657567744"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("68988960768"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("550831652864"), + new BigInteger("1108169195520"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17661175005184"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4521260802375680"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1157442765409222656"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("16"), + new BigInteger("32"), + new BigInteger("64"), + new BigInteger("0"), + new BigInteger("7936"), + new BigInteger("7680"), + new BigInteger("7168"), + new BigInteger("6144"), + new BigInteger("4096"), + new BigInteger("0"), + new BigInteger("16384"), + new BigInteger("49152"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1048576"), + new BigInteger("2097152"), + new BigInteger("4194304"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("135266304"), + new BigInteger("0"), + new BigInteger("538968064"), + new BigInteger("0"), + new BigInteger("2151677952"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17315135488"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("137977921536"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2216338391040"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("35322350010368"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("283691315101696"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9042521604751360"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2314885530818445312"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("32"), + new BigInteger("64"), + new BigInteger("128"), + new BigInteger("16128"), + new BigInteger("15872"), + new BigInteger("15360"), + new BigInteger("14336"), + new BigInteger("12288"), + new BigInteger("8192"), + new BigInteger("0"), + new BigInteger("32768"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2097152"), + new BigInteger("4194304"), + new BigInteger("8388608"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("270532608"), + new BigInteger("0"), + new BigInteger("1077936128"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("34630270976"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("275955843072"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4432676782080"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("70644700020736"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("567382630203392"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("18085043209502720"), + new BigInteger("0"), + new BigInteger("72624976668131328"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4629771061636890624"), + new BigInteger("0"), + }, + { + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("64"), + new BigInteger("128"), + new BigInteger("32512"), + new BigInteger("32256"), + new BigInteger("31744"), + new BigInteger("30720"), + new BigInteger("28672"), + new BigInteger("24576"), + new BigInteger("16384"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4194304"), + new BigInteger("8388608"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("541065216"), + new BigInteger("0"), + new BigInteger("2155872256"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("69260541952"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("551911686144"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8865353564160"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("141289400041472"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1134765260406784"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("36170086419005440"), + new BigInteger("0"), + new BigInteger("145249953336262656"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9259542123273781248"), + }, + { + new BigInteger("257"), + new BigInteger("0"), + new BigInteger("516"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("256"), + new BigInteger("512"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("131072"), + new BigInteger("393216"), + new BigInteger("917504"), + new BigInteger("1966080"), + new BigInteger("4063232"), + new BigInteger("8257536"), + new BigInteger("16646144"), + new BigInteger("16777216"), + new BigInteger("33554432"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4311744512"), + new BigInteger("0"), + new BigInteger("17213423616"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1103823372288"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8813306445824"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("282578800082944"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4512412933816320"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("72340172838010880"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2310355422147510272"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("0"), + new BigInteger("514"), + new BigInteger("0"), + new BigInteger("1032"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("256"), + new BigInteger("512"), + new BigInteger("1024"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("65536"), + new BigInteger("0"), + new BigInteger("262144"), + new BigInteger("786432"), + new BigInteger("1835008"), + new BigInteger("3932160"), + new BigInteger("8126464"), + new BigInteger("16515072"), + new BigInteger("16777216"), + new BigInteger("33554432"), + new BigInteger("67108864"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8623489024"), + new BigInteger("0"), + new BigInteger("34426847232"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2207646744576"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17626612891648"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("565157600165888"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9024825867632640"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("144680345676021760"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4620710844295020544"), + new BigInteger("0"), + }, + { + new BigInteger("513"), + new BigInteger("0"), + new BigInteger("1028"), + new BigInteger("0"), + new BigInteger("2064"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("512"), + new BigInteger("1024"), + new BigInteger("2048"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("196608"), + new BigInteger("131072"), + new BigInteger("0"), + new BigInteger("524288"), + new BigInteger("1572864"), + new BigInteger("3670016"), + new BigInteger("7864320"), + new BigInteger("16252928"), + new BigInteger("0"), + new BigInteger("33554432"), + new BigInteger("67108864"), + new BigInteger("134217728"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4328521728"), + new BigInteger("0"), + new BigInteger("17246978048"), + new BigInteger("0"), + new BigInteger("68853694464"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4415293489152"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("35253225783296"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1130315200331776"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("18049651735265280"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("289360691352043520"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9241421688590041088"), + }, + { + new BigInteger("0"), + new BigInteger("1026"), + new BigInteger("0"), + new BigInteger("2056"), + new BigInteger("0"), + new BigInteger("4128"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1024"), + new BigInteger("2048"), + new BigInteger("4096"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("458752"), + new BigInteger("393216"), + new BigInteger("262144"), + new BigInteger("0"), + new BigInteger("1048576"), + new BigInteger("3145728"), + new BigInteger("7340032"), + new BigInteger("15728640"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("67108864"), + new BigInteger("134217728"), + new BigInteger("268435456"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8657043456"), + new BigInteger("0"), + new BigInteger("34493956096"), + new BigInteger("0"), + new BigInteger("137707388928"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1108168671232"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8830586978304"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("70506451566592"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2260630400663552"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("36099303470530560"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("578721382704087040"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("36099303470530561"), + new BigInteger("0"), + new BigInteger("2052"), + new BigInteger("0"), + new BigInteger("4112"), + new BigInteger("0"), + new BigInteger("8256"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2048"), + new BigInteger("4096"), + new BigInteger("8192"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("983040"), + new BigInteger("917504"), + new BigInteger("786432"), + new BigInteger("524288"), + new BigInteger("0"), + new BigInteger("2097152"), + new BigInteger("6291456"), + new BigInteger("14680064"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("134217728"), + new BigInteger("268435456"), + new BigInteger("536870912"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17314086912"), + new BigInteger("0"), + new BigInteger("68987912192"), + new BigInteger("0"), + new BigInteger("275414777856"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2216337342464"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17661173956608"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("141012903133184"), + new BigInteger("283691314053120"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4521260801327104"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1157442765408174080"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4104"), + new BigInteger("0"), + new BigInteger("8224"), + new BigInteger("0"), + new BigInteger("16512"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4096"), + new BigInteger("8192"), + new BigInteger("16384"), + new BigInteger("0"), + new BigInteger("2031616"), + new BigInteger("1966080"), + new BigInteger("1835008"), + new BigInteger("1572864"), + new BigInteger("1048576"), + new BigInteger("0"), + new BigInteger("4194304"), + new BigInteger("12582912"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("268435456"), + new BigInteger("536870912"), + new BigInteger("1073741824"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("34628173824"), + new BigInteger("0"), + new BigInteger("137975824384"), + new BigInteger("0"), + new BigInteger("550829555712"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4432674684928"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("35322347913216"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("567382628106240"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9042521602654208"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("72624976666034176"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2314885530816348160"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8208"), + new BigInteger("0"), + new BigInteger("16448"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8192"), + new BigInteger("16384"), + new BigInteger("32768"), + new BigInteger("4128768"), + new BigInteger("4063232"), + new BigInteger("3932160"), + new BigInteger("3670016"), + new BigInteger("3145728"), + new BigInteger("2097152"), + new BigInteger("0"), + new BigInteger("8388608"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("536870912"), + new BigInteger("1073741824"), + new BigInteger("2147483648"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("69256347648"), + new BigInteger("0"), + new BigInteger("275951648768"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8865349369856"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("70644695826432"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1134765256212480"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("18085043205308416"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("145249953332068352"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4629771061632696320"), + new BigInteger("0"), + }, + { + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("16416"), + new BigInteger("0"), + new BigInteger("32896"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("16384"), + new BigInteger("32768"), + new BigInteger("8323072"), + new BigInteger("8257536"), + new BigInteger("8126464"), + new BigInteger("7864320"), + new BigInteger("7340032"), + new BigInteger("6291456"), + new BigInteger("4194304"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1073741824"), + new BigInteger("2147483648"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("138512695296"), + new BigInteger("0"), + new BigInteger("551903297536"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17730698739712"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("141289391652864"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2269530512424960"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("36170086410616832"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("290499906664136704"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9259542123265392640"), + }, + { + new BigInteger("65793"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("132104"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("65792"), + new BigInteger("0"), + new BigInteger("132096"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("65536"), + new BigInteger("131072"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("33554432"), + new BigInteger("100663296"), + new BigInteger("234881024"), + new BigInteger("503316480"), + new BigInteger("1040187392"), + new BigInteger("2113929216"), + new BigInteger("4261412864"), + new BigInteger("4294967296"), + new BigInteger("8589934592"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1103806595072"), + new BigInteger("0"), + new BigInteger("4406636445696"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("282578783305728"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2256206450130944"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("72340172821233664"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1155177711056977920"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("0"), + new BigInteger("131586"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("264208"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("131584"), + new BigInteger("0"), + new BigInteger("264192"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("65536"), + new BigInteger("131072"), + new BigInteger("262144"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("16777216"), + new BigInteger("0"), + new BigInteger("67108864"), + new BigInteger("201326592"), + new BigInteger("469762048"), + new BigInteger("1006632960"), + new BigInteger("2080374784"), + new BigInteger("4227858432"), + new BigInteger("4294967296"), + new BigInteger("8589934592"), + new BigInteger("17179869184"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2207613190144"), + new BigInteger("0"), + new BigInteger("8813272891392"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("565157566611456"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4512412900261888"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("144680345642467328"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2310355422113955840"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("263172"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("528416"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("131328"), + new BigInteger("0"), + new BigInteger("263168"), + new BigInteger("0"), + new BigInteger("528384"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("131072"), + new BigInteger("262144"), + new BigInteger("524288"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("50331648"), + new BigInteger("33554432"), + new BigInteger("0"), + new BigInteger("134217728"), + new BigInteger("402653184"), + new BigInteger("939524096"), + new BigInteger("2013265920"), + new BigInteger("4160749568"), + new BigInteger("0"), + new BigInteger("8589934592"), + new BigInteger("17179869184"), + new BigInteger("34359738368"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1108101562368"), + new BigInteger("0"), + new BigInteger("4415226380288"), + new BigInteger("0"), + new BigInteger("17626545782784"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1130315133222912"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9024825800523776"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("289360691284934656"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4620710844227911680"), + new BigInteger("0"), + }, + { + new BigInteger("262657"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("526344"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1056832"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("262656"), + new BigInteger("0"), + new BigInteger("526336"), + new BigInteger("0"), + new BigInteger("1056768"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("262144"), + new BigInteger("524288"), + new BigInteger("1048576"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("117440512"), + new BigInteger("100663296"), + new BigInteger("67108864"), + new BigInteger("0"), + new BigInteger("268435456"), + new BigInteger("805306368"), + new BigInteger("1879048192"), + new BigInteger("4026531840"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17179869184"), + new BigInteger("34359738368"), + new BigInteger("68719476736"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2216203124736"), + new BigInteger("0"), + new BigInteger("8830452760576"), + new BigInteger("0"), + new BigInteger("35253091565568"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("283691179835392"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2260630266445824"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("18049651601047552"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("578721382569869312"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9241421688455823360"), + }, + { + new BigInteger("0"), + new BigInteger("525314"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1052688"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2113664"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("525312"), + new BigInteger("0"), + new BigInteger("1052672"), + new BigInteger("0"), + new BigInteger("2113536"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("524288"), + new BigInteger("1048576"), + new BigInteger("2097152"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("251658240"), + new BigInteger("234881024"), + new BigInteger("201326592"), + new BigInteger("134217728"), + new BigInteger("0"), + new BigInteger("536870912"), + new BigInteger("1610612736"), + new BigInteger("3758096384"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("34359738368"), + new BigInteger("68719476736"), + new BigInteger("137438953472"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4432406249472"), + new BigInteger("0"), + new BigInteger("17660905521152"), + new BigInteger("0"), + new BigInteger("70506183131136"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("567382359670784"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4521260532891648"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("36099303202095104"), + new BigInteger("72624976397598720"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1157442765139738624"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("36099303202095105"), + new BigInteger("0"), + new BigInteger("1050628"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2105376"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1050624"), + new BigInteger("0"), + new BigInteger("2105344"), + new BigInteger("0"), + new BigInteger("4227072"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1048576"), + new BigInteger("2097152"), + new BigInteger("4194304"), + new BigInteger("0"), + new BigInteger("520093696"), + new BigInteger("503316480"), + new BigInteger("469762048"), + new BigInteger("402653184"), + new BigInteger("268435456"), + new BigInteger("0"), + new BigInteger("1073741824"), + new BigInteger("3221225472"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("68719476736"), + new BigInteger("137438953472"), + new BigInteger("274877906944"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8864812498944"), + new BigInteger("0"), + new BigInteger("35321811042304"), + new BigInteger("0"), + new BigInteger("141012366262272"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1134764719341568"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9042521065783296"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("145249952795197440"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2314885530279477248"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2101256"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4210752"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2101248"), + new BigInteger("0"), + new BigInteger("4210688"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2097152"), + new BigInteger("4194304"), + new BigInteger("8388608"), + new BigInteger("1056964608"), + new BigInteger("1040187392"), + new BigInteger("1006632960"), + new BigInteger("939524096"), + new BigInteger("805306368"), + new BigInteger("536870912"), + new BigInteger("0"), + new BigInteger("2147483648"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("137438953472"), + new BigInteger("274877906944"), + new BigInteger("549755813888"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17729624997888"), + new BigInteger("0"), + new BigInteger("70643622084608"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2269529438683136"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("18085042131566592"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("290499905590394880"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4629771060558954496"), + new BigInteger("0"), + }, + { + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4202512"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8421504"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4202496"), + new BigInteger("0"), + new BigInteger("8421376"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4194304"), + new BigInteger("8388608"), + new BigInteger("2130706432"), + new BigInteger("2113929216"), + new BigInteger("2080374784"), + new BigInteger("2013265920"), + new BigInteger("1879048192"), + new BigInteger("1610612736"), + new BigInteger("1073741824"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("274877906944"), + new BigInteger("549755813888"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("35459249995776"), + new BigInteger("0"), + new BigInteger("141287244169216"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4539058877366272"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("36170084263133184"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("580999811180789760"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9259542121117908992"), + }, + { + new BigInteger("16843009"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("33818640"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("16843008"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("33818624"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("16842752"), + new BigInteger("0"), + new BigInteger("33816576"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("16777216"), + new BigInteger("33554432"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8589934592"), + new BigInteger("25769803776"), + new BigInteger("60129542144"), + new BigInteger("128849018880"), + new BigInteger("266287972352"), + new BigInteger("541165879296"), + new BigInteger("1090921693184"), + new BigInteger("1099511627776"), + new BigInteger("2199023255552"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("282574488338432"), + new BigInteger("0"), + new BigInteger("1128098930098176"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("72340168526266368"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("577588851233521664"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("0"), + new BigInteger("33686018"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("67637280"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("33686016"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("67637248"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("33685504"), + new BigInteger("0"), + new BigInteger("67633152"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("16777216"), + new BigInteger("33554432"), + new BigInteger("67108864"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4294967296"), + new BigInteger("0"), + new BigInteger("17179869184"), + new BigInteger("51539607552"), + new BigInteger("120259084288"), + new BigInteger("257698037760"), + new BigInteger("532575944704"), + new BigInteger("1082331758592"), + new BigInteger("1099511627776"), + new BigInteger("2199023255552"), + new BigInteger("4398046511104"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("565148976676864"), + new BigInteger("0"), + new BigInteger("2256197860196352"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("144680337052532736"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1155177702467043328"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("67372036"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("135274560"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("67372032"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("135274496"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("33619968"), + new BigInteger("0"), + new BigInteger("67371008"), + new BigInteger("0"), + new BigInteger("135266304"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("33554432"), + new BigInteger("67108864"), + new BigInteger("134217728"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("12884901888"), + new BigInteger("8589934592"), + new BigInteger("0"), + new BigInteger("34359738368"), + new BigInteger("103079215104"), + new BigInteger("240518168576"), + new BigInteger("515396075520"), + new BigInteger("1065151889408"), + new BigInteger("0"), + new BigInteger("2199023255552"), + new BigInteger("4398046511104"), + new BigInteger("8796093022208"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("283673999966208"), + new BigInteger("0"), + new BigInteger("1130297953353728"), + new BigInteger("0"), + new BigInteger("4512395720392704"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("289360674105065472"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2310355404934086656"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("134744072"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("270549120"), + new BigInteger("67240192"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("134744064"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("270548992"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("67239936"), + new BigInteger("0"), + new BigInteger("134742016"), + new BigInteger("0"), + new BigInteger("270532608"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("67108864"), + new BigInteger("134217728"), + new BigInteger("268435456"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("30064771072"), + new BigInteger("25769803776"), + new BigInteger("17179869184"), + new BigInteger("0"), + new BigInteger("68719476736"), + new BigInteger("206158430208"), + new BigInteger("481036337152"), + new BigInteger("1030792151040"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4398046511104"), + new BigInteger("8796093022208"), + new BigInteger("17592186044416"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("567347999932416"), + new BigInteger("0"), + new BigInteger("2260595906707456"), + new BigInteger("0"), + new BigInteger("9024791440785408"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("72624942037860352"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("578721348210130944"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4620710809868173312"), + new BigInteger("0"), + }, + { + new BigInteger("134480385"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("269488144"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("134480384"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("269488128"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("541097984"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("134479872"), + new BigInteger("0"), + new BigInteger("269484032"), + new BigInteger("0"), + new BigInteger("541065216"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("134217728"), + new BigInteger("268435456"), + new BigInteger("536870912"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("64424509440"), + new BigInteger("60129542144"), + new BigInteger("51539607552"), + new BigInteger("34359738368"), + new BigInteger("0"), + new BigInteger("137438953472"), + new BigInteger("412316860416"), + new BigInteger("962072674304"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8796093022208"), + new BigInteger("17592186044416"), + new BigInteger("35184372088832"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1134695999864832"), + new BigInteger("0"), + new BigInteger("4521191813414912"), + new BigInteger("0"), + new BigInteger("18049582881570816"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("145249884075720704"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1157442696420261888"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9241421619736346624"), + }, + { + new BigInteger("0"), + new BigInteger("268960770"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("538976288"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("268960768"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("538976256"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("268959744"), + new BigInteger("0"), + new BigInteger("538968064"), + new BigInteger("0"), + new BigInteger("1082130432"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("268435456"), + new BigInteger("536870912"), + new BigInteger("1073741824"), + new BigInteger("0"), + new BigInteger("133143986176"), + new BigInteger("128849018880"), + new BigInteger("120259084288"), + new BigInteger("103079215104"), + new BigInteger("68719476736"), + new BigInteger("0"), + new BigInteger("274877906944"), + new BigInteger("824633720832"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17592186044416"), + new BigInteger("35184372088832"), + new BigInteger("70368744177664"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2269391999729664"), + new BigInteger("0"), + new BigInteger("9042383626829824"), + new BigInteger("0"), + new BigInteger("36099165763141632"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("290499768151441408"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2314885392840523776"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("36099165763141633"), + new BigInteger("0"), + new BigInteger("537921540"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1077952576"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("537921536"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1077952512"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("537919488"), + new BigInteger("0"), + new BigInteger("1077936128"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("536870912"), + new BigInteger("1073741824"), + new BigInteger("2147483648"), + new BigInteger("270582939648"), + new BigInteger("266287972352"), + new BigInteger("257698037760"), + new BigInteger("240518168576"), + new BigInteger("206158430208"), + new BigInteger("137438953472"), + new BigInteger("0"), + new BigInteger("549755813888"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("35184372088832"), + new BigInteger("70368744177664"), + new BigInteger("140737488355328"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4538783999459328"), + new BigInteger("0"), + new BigInteger("18084767253659648"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("580999536302882816"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4629770785681047552"), + new BigInteger("0"), + }, + { + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1075843080"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2155905152"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1075843072"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2155905024"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1075838976"), + new BigInteger("0"), + new BigInteger("2155872256"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1073741824"), + new BigInteger("2147483648"), + new BigInteger("545460846592"), + new BigInteger("541165879296"), + new BigInteger("532575944704"), + new BigInteger("515396075520"), + new BigInteger("481036337152"), + new BigInteger("412316860416"), + new BigInteger("274877906944"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("70368744177664"), + new BigInteger("140737488355328"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9077567998918656"), + new BigInteger("0"), + new BigInteger("36169534507319296"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1161999072605765632"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9259541571362095104"), + }, + { + new BigInteger("4311810305"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8657571872"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4311810304"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8657571840"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4311810048"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8657567744"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4311744512"), + new BigInteger("0"), + new BigInteger("8657043456"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4294967296"), + new BigInteger("8589934592"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2199023255552"), + new BigInteger("6597069766656"), + new BigInteger("15393162788864"), + new BigInteger("32985348833280"), + new BigInteger("68169720922112"), + new BigInteger("138538465099776"), + new BigInteger("279275953455104"), + new BigInteger("281474976710656"), + new BigInteger("562949953421312"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("72339069014638592"), + new BigInteger("0"), + new BigInteger("288793326105133056"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("0"), + new BigInteger("8623620610"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17315143744"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8623620608"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17315143680"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8623620096"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17315135488"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8623489024"), + new BigInteger("0"), + new BigInteger("17314086912"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4294967296"), + new BigInteger("8589934592"), + new BigInteger("17179869184"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1099511627776"), + new BigInteger("0"), + new BigInteger("4398046511104"), + new BigInteger("13194139533312"), + new BigInteger("30786325577728"), + new BigInteger("65970697666560"), + new BigInteger("136339441844224"), + new BigInteger("277076930199552"), + new BigInteger("281474976710656"), + new BigInteger("562949953421312"), + new BigInteger("1125899906842624"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("144678138029277184"), + new BigInteger("0"), + new BigInteger("577586652210266112"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17247241220"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("34630287488"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17247241216"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("34630287360"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17247240192"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("34630270976"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8606711808"), + new BigInteger("0"), + new BigInteger("17246978048"), + new BigInteger("0"), + new BigInteger("34628173824"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8589934592"), + new BigInteger("17179869184"), + new BigInteger("34359738368"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("3298534883328"), + new BigInteger("2199023255552"), + new BigInteger("0"), + new BigInteger("8796093022208"), + new BigInteger("26388279066624"), + new BigInteger("61572651155456"), + new BigInteger("131941395333120"), + new BigInteger("272678883688448"), + new BigInteger("0"), + new BigInteger("562949953421312"), + new BigInteger("1125899906842624"), + new BigInteger("2251799813685248"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("72620543991349248"), + new BigInteger("0"), + new BigInteger("289356276058554368"), + new BigInteger("0"), + new BigInteger("1155173304420532224"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("34494482440"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("34494482432"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("69260574720"), + new BigInteger("17213489152"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("34494480384"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("69260541952"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17213423616"), + new BigInteger("0"), + new BigInteger("34493956096"), + new BigInteger("0"), + new BigInteger("69256347648"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17179869184"), + new BigInteger("34359738368"), + new BigInteger("68719476736"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("7696581394432"), + new BigInteger("6597069766656"), + new BigInteger("4398046511104"), + new BigInteger("0"), + new BigInteger("17592186044416"), + new BigInteger("52776558133248"), + new BigInteger("123145302310912"), + new BigInteger("263882790666240"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1125899906842624"), + new BigInteger("2251799813685248"), + new BigInteger("4503599627370496"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("145241087982698496"), + new BigInteger("0"), + new BigInteger("578712552117108736"), + new BigInteger("0"), + new BigInteger("2310346608841064448"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("68988964880"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("34426978560"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("68988964864"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("34426978304"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("68988960768"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("138521083904"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("34426847232"), + new BigInteger("0"), + new BigInteger("68987912192"), + new BigInteger("0"), + new BigInteger("138512695296"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("34359738368"), + new BigInteger("68719476736"), + new BigInteger("137438953472"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("16492674416640"), + new BigInteger("15393162788864"), + new BigInteger("13194139533312"), + new BigInteger("8796093022208"), + new BigInteger("0"), + new BigInteger("35184372088832"), + new BigInteger("105553116266496"), + new BigInteger("246290604621824"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2251799813685248"), + new BigInteger("4503599627370496"), + new BigInteger("9007199254740992"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("290482175965396992"), + new BigInteger("0"), + new BigInteger("1157425104234217472"), + new BigInteger("0"), + new BigInteger("4620693217682128896"), + new BigInteger("0"), + }, + { + new BigInteger("68853957121"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("137977929760"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("68853957120"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("137977929728"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("68853956608"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("137977921536"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("68853694464"), + new BigInteger("0"), + new BigInteger("137975824384"), + new BigInteger("0"), + new BigInteger("277025390592"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("68719476736"), + new BigInteger("137438953472"), + new BigInteger("274877906944"), + new BigInteger("0"), + new BigInteger("34084860461056"), + new BigInteger("32985348833280"), + new BigInteger("30786325577728"), + new BigInteger("26388279066624"), + new BigInteger("17592186044416"), + new BigInteger("0"), + new BigInteger("70368744177664"), + new BigInteger("211106232532992"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4503599627370496"), + new BigInteger("9007199254740992"), + new BigInteger("18014398509481984"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("580964351930793984"), + new BigInteger("0"), + new BigInteger("2314850208468434944"), + new BigInteger("0"), + new BigInteger("9241386435364257792"), + }, + { + new BigInteger("0"), + new BigInteger("137707914242"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("275955859520"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("137707914240"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("275955859456"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("137707913216"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("275955843072"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("137707388928"), + new BigInteger("0"), + new BigInteger("275951648768"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("137438953472"), + new BigInteger("274877906944"), + new BigInteger("549755813888"), + new BigInteger("69269232549888"), + new BigInteger("68169720922112"), + new BigInteger("65970697666560"), + new BigInteger("61572651155456"), + new BigInteger("52776558133248"), + new BigInteger("35184372088832"), + new BigInteger("0"), + new BigInteger("140737488355328"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9007199254740992"), + new BigInteger("18014398509481984"), + new BigInteger("36028797018963968"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1161928703861587968"), + new BigInteger("0"), + new BigInteger("4629700416936869888"), + new BigInteger("0"), + }, + { + new BigInteger("36028797018963969"), + new BigInteger("0"), + new BigInteger("275415828484"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("551911719040"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("275415828480"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("551911718912"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("275415826432"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("551911686144"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("275414777856"), + new BigInteger("0"), + new BigInteger("551903297536"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("274877906944"), + new BigInteger("549755813888"), + new BigInteger("139637976727552"), + new BigInteger("138538465099776"), + new BigInteger("136339441844224"), + new BigInteger("131941395333120"), + new BigInteger("123145302310912"), + new BigInteger("105553116266496"), + new BigInteger("70368744177664"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("18014398509481984"), + new BigInteger("36028797018963968"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2323857407723175936"), + new BigInteger("0"), + new BigInteger("9259400833873739776"), + }, + { + new BigInteger("1103823438081"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2216338399296"), + new BigInteger("0"), + new BigInteger("1103823438080"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2216338399232"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1103823437824"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2216338391040"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1103823372288"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2216337342464"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1103806595072"), + new BigInteger("0"), + new BigInteger("2216203124736"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1099511627776"), + new BigInteger("2199023255552"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("562949953421312"), + new BigInteger("1688849860263936"), + new BigInteger("3940649673949184"), + new BigInteger("8444249301319680"), + new BigInteger("17451448556060672"), + new BigInteger("35465847065542656"), + new BigInteger("71494644084506624"), + new BigInteger("72057594037927936"), + new BigInteger("144115188075855872"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("0"), + new BigInteger("2207646876162"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4432676798592"), + new BigInteger("0"), + new BigInteger("2207646876160"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4432676798464"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2207646875648"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4432676782080"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2207646744576"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4432674684928"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2207613190144"), + new BigInteger("0"), + new BigInteger("4432406249472"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1099511627776"), + new BigInteger("2199023255552"), + new BigInteger("4398046511104"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("281474976710656"), + new BigInteger("0"), + new BigInteger("1125899906842624"), + new BigInteger("3377699720527872"), + new BigInteger("7881299347898368"), + new BigInteger("16888498602639360"), + new BigInteger("34902897112121344"), + new BigInteger("70931694131085312"), + new BigInteger("72057594037927936"), + new BigInteger("144115188075855872"), + new BigInteger("288230376151711744"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4415293752324"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4415293752320"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8865353596928"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4415293751296"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8865353564160"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4415293489152"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8865349369856"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2203318222848"), + new BigInteger("0"), + new BigInteger("4415226380288"), + new BigInteger("0"), + new BigInteger("8864812498944"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2199023255552"), + new BigInteger("4398046511104"), + new BigInteger("8796093022208"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("844424930131968"), + new BigInteger("562949953421312"), + new BigInteger("0"), + new BigInteger("2251799813685248"), + new BigInteger("6755399441055744"), + new BigInteger("15762598695796736"), + new BigInteger("33776997205278720"), + new BigInteger("69805794224242688"), + new BigInteger("0"), + new BigInteger("144115188075855872"), + new BigInteger("288230376151711744"), + new BigInteger("576460752303423488"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8830587504648"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8830587504640"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8830587502592"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17730707128320"), + new BigInteger("4406653222912"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8830586978304"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17730698739712"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4406636445696"), + new BigInteger("0"), + new BigInteger("8830452760576"), + new BigInteger("0"), + new BigInteger("17729624997888"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4398046511104"), + new BigInteger("8796093022208"), + new BigInteger("17592186044416"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1970324836974592"), + new BigInteger("1688849860263936"), + new BigInteger("1125899906842624"), + new BigInteger("0"), + new BigInteger("4503599627370496"), + new BigInteger("13510798882111488"), + new BigInteger("31525197391593472"), + new BigInteger("67553994410557440"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("288230376151711744"), + new BigInteger("576460752303423488"), + new BigInteger("1152921504606846976"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17661175009296"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17661175009280"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8813306511360"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17661175005184"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8813306445824"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17661173956608"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("35461397479424"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8813272891392"), + new BigInteger("0"), + new BigInteger("17660905521152"), + new BigInteger("0"), + new BigInteger("35459249995776"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("8796093022208"), + new BigInteger("17592186044416"), + new BigInteger("35184372088832"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4222124650659840"), + new BigInteger("3940649673949184"), + new BigInteger("3377699720527872"), + new BigInteger("2251799813685248"), + new BigInteger("0"), + new BigInteger("9007199254740992"), + new BigInteger("27021597764222976"), + new BigInteger("63050394783186944"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("576460752303423488"), + new BigInteger("1152921504606846976"), + new BigInteger("2305843009213693952"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("35322350018592"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17626613022976"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("35322350018560"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17626613022720"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("35322350010368"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17626612891648"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("35322347913216"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17626545782784"), + new BigInteger("0"), + new BigInteger("35321811042304"), + new BigInteger("0"), + new BigInteger("70918499991552"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("17592186044416"), + new BigInteger("35184372088832"), + new BigInteger("70368744177664"), + new BigInteger("0"), + new BigInteger("8725724278030336"), + new BigInteger("8444249301319680"), + new BigInteger("7881299347898368"), + new BigInteger("6755399441055744"), + new BigInteger("4503599627370496"), + new BigInteger("0"), + new BigInteger("18014398509481984"), + new BigInteger("54043195528445952"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1152921504606846976"), + new BigInteger("2305843009213693952"), + new BigInteger("4611686018427387904"), + new BigInteger("0"), + }, + { + new BigInteger("35253226045953"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("70644700037184"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("35253226045952"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("70644700037120"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("35253226045440"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("70644700020736"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("35253225783296"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("70644695826432"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("35253091565568"), + new BigInteger("0"), + new BigInteger("70643622084608"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("35184372088832"), + new BigInteger("70368744177664"), + new BigInteger("140737488355328"), + new BigInteger("17732923532771328"), + new BigInteger("17451448556060672"), + new BigInteger("16888498602639360"), + new BigInteger("15762598695796736"), + new BigInteger("13510798882111488"), + new BigInteger("9007199254740992"), + new BigInteger("0"), + new BigInteger("36028797018963968"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2305843009213693952"), + new BigInteger("4611686018427387904"), + new BigInteger("9223372036854775808"), + }, + { + new BigInteger("0"), + new BigInteger("70506452091906"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("141289400074368"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("70506452091904"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("141289400074240"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("70506452090880"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("141289400041472"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("70506451566592"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("141289391652864"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("70506183131136"), + new BigInteger("0"), + new BigInteger("141287244169216"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("70368744177664"), + new BigInteger("140737488355328"), + new BigInteger("35747322042253312"), + new BigInteger("35465847065542656"), + new BigInteger("34902897112121344"), + new BigInteger("33776997205278720"), + new BigInteger("31525197391593472"), + new BigInteger("27021597764222976"), + new BigInteger("18014398509481984"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4611686018427387904"), + new BigInteger("9223372036854775808"), + }, + { + new BigInteger("282578800148737"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("567382630219904"), + new BigInteger("282578800148736"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("567382630219776"), + new BigInteger("0"), + new BigInteger("282578800148480"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("567382630203392"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("282578800082944"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("567382628106240"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("282578783305728"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("567382359670784"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("282574488338432"), + new BigInteger("0"), + new BigInteger("567347999932416"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("281474976710656"), + new BigInteger("562949953421312"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("144115188075855872"), + new BigInteger("432345564227567616"), + new BigInteger("1008806316530991104"), + new BigInteger("2161727821137838080"), + new BigInteger("4467570830351532032"), + new BigInteger("9079256848778919936"), + new BigInteger("18302628885633695744"), + }, + { + new BigInteger("0"), + new BigInteger("565157600297474"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("565157600297472"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1134765260439552"), + new BigInteger("0"), + new BigInteger("565157600296960"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1134765260406784"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("565157600165888"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1134765256212480"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("565157566611456"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1134764719341568"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("565148976676864"), + new BigInteger("0"), + new BigInteger("1134695999864832"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("281474976710656"), + new BigInteger("562949953421312"), + new BigInteger("1125899906842624"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("72057594037927936"), + new BigInteger("0"), + new BigInteger("288230376151711744"), + new BigInteger("864691128455135232"), + new BigInteger("2017612633061982208"), + new BigInteger("4323455642275676160"), + new BigInteger("8935141660703064064"), + new BigInteger("18158513697557839872"), + }, + { + new BigInteger("18158513697557839873"), + new BigInteger("0"), + new BigInteger("1130315200594948"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1130315200594944"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1130315200593920"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2269530520813568"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1130315200331776"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2269530512424960"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1130315133222912"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2269529438683136"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("564049465049088"), + new BigInteger("0"), + new BigInteger("1130297953353728"), + new BigInteger("0"), + new BigInteger("2269391999729664"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("562949953421312"), + new BigInteger("1125899906842624"), + new BigInteger("2251799813685248"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("216172782113783808"), + new BigInteger("144115188075855872"), + new BigInteger("0"), + new BigInteger("576460752303423488"), + new BigInteger("1729382256910270464"), + new BigInteger("4035225266123964416"), + new BigInteger("8646911284551352320"), + new BigInteger("17870283321406128128"), + }, + { + new BigInteger("17870283321406128129"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2260630401189896"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2260630401189888"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2260630401187840"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2260630400663552"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4539061024849920"), + new BigInteger("1128103225065472"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2260630266445824"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4539058877366272"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1128098930098176"), + new BigInteger("0"), + new BigInteger("2260595906707456"), + new BigInteger("0"), + new BigInteger("4538783999459328"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1125899906842624"), + new BigInteger("2251799813685248"), + new BigInteger("4503599627370496"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("504403158265495552"), + new BigInteger("432345564227567616"), + new BigInteger("288230376151711744"), + new BigInteger("0"), + new BigInteger("1152921504606846976"), + new BigInteger("3458764513820540928"), + new BigInteger("8070450532247928832"), + new BigInteger("17293822569102704640"), + }, + { + new BigInteger("17293822569102704641"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4521260802379792"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4521260802379776"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4521260802375680"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2256206466908160"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4521260801327104"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2256206450130944"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4521260532891648"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9078117754732544"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2256197860196352"), + new BigInteger("0"), + new BigInteger("4521191813414912"), + new BigInteger("0"), + new BigInteger("9077567998918656"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2251799813685248"), + new BigInteger("4503599627370496"), + new BigInteger("9007199254740992"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1080863910568919040"), + new BigInteger("1008806316530991104"), + new BigInteger("864691128455135232"), + new BigInteger("576460752303423488"), + new BigInteger("0"), + new BigInteger("2305843009213693952"), + new BigInteger("6917529027641081856"), + new BigInteger("16140901064495857664"), + }, + { + new BigInteger("16140901064495857665"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9042521604759584"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9042521604759552"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4512412933881856"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9042521604751360"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4512412933816320"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9042521602654208"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4512412900261888"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9042521065783296"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4512395720392704"), + new BigInteger("0"), + new BigInteger("9042383626829824"), + new BigInteger("0"), + new BigInteger("18155135997837312"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("4503599627370496"), + new BigInteger("9007199254740992"), + new BigInteger("18014398509481984"), + new BigInteger("0"), + new BigInteger("2233785415175766016"), + new BigInteger("2161727821137838080"), + new BigInteger("2017612633061982208"), + new BigInteger("1729382256910270464"), + new BigInteger("1152921504606846976"), + new BigInteger("0"), + new BigInteger("4611686018427387904"), + new BigInteger("13835058055282163712"), + }, + { + new BigInteger("13835058055282163713"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("18085043209519168"), + new BigInteger("0"), + new BigInteger("9024825867763968"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("18085043209519104"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9024825867763712"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("18085043209502720"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9024825867632640"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("18085043205308416"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9024825800523776"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("18085042131566592"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9024791440785408"), + new BigInteger("0"), + new BigInteger("18084767253659648"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("9007199254740992"), + new BigInteger("18014398509481984"), + new BigInteger("36028797018963968"), + new BigInteger("4539628424389459968"), + new BigInteger("4467570830351532032"), + new BigInteger("4323455642275676160"), + new BigInteger("4035225266123964416"), + new BigInteger("3458764513820540928"), + new BigInteger("2305843009213693952"), + new BigInteger("0"), + new BigInteger("9223372036854775808"), + }, + { + new BigInteger("18049651735527937"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("36170086419038336"), + new BigInteger("0"), + new BigInteger("18049651735527936"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("36170086419038208"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("18049651735527424"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("36170086419005440"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("18049651735265280"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("36170086410616832"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("18049651601047552"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("36170084263133184"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("18049582881570816"), + new BigInteger("0"), + new BigInteger("36169534507319296"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("18014398509481984"), + new BigInteger("36028797018963968"), + new BigInteger("9151314442816847872"), + new BigInteger("9079256848778919936"), + new BigInteger("8935141660703064064"), + new BigInteger("8646911284551352320"), + new BigInteger("8070450532247928832"), + new BigInteger("6917529027641081856"), + new BigInteger("4611686018427387904"), + new BigInteger("0"), + }, +}; +} \ No newline at end of file diff --git a/Java/MoveConstants.java b/Java/MoveConstants.java new file mode 100644 index 0000000..2904c73 --- /dev/null +++ b/Java/MoveConstants.java @@ -0,0 +1,879 @@ + +import java.math.BigInteger; + +public class MoveConstants { + +//#region + + + public static final BigInteger[] KNIGHT_ATTACKS = + { + new BigInteger("132096"), + new BigInteger("329728"), + new BigInteger("659712"), + new BigInteger("1319424"), + new BigInteger("2638848"), + new BigInteger("5277696"), + new BigInteger("10489856"), + new BigInteger("4202496"), + new BigInteger("33816580"), + new BigInteger("84410376"), + new BigInteger("168886289"), + new BigInteger("337772578"), + new BigInteger("675545156"), + new BigInteger("1351090312"), + new BigInteger("2685403152"), + new BigInteger("1075839008"), + new BigInteger("8657044482"), + new BigInteger("21609056261"), + new BigInteger("43234889994"), + new BigInteger("86469779988"), + new BigInteger("172939559976"), + new BigInteger("345879119952"), + new BigInteger("687463207072"), + new BigInteger("275414786112"), + new BigInteger("2216203387392"), + new BigInteger("5531918402816"), + new BigInteger("11068131838464"), + new BigInteger("22136263676928"), + new BigInteger("44272527353856"), + new BigInteger("88545054707712"), + new BigInteger("175990581010432"), + new BigInteger("70506185244672"), + new BigInteger("567348067172352"), + new BigInteger("1416171111120896"), + new BigInteger("2833441750646784"), + new BigInteger("5666883501293568"), + new BigInteger("11333767002587136"), + new BigInteger("22667534005174272"), + new BigInteger("45053588738670592"), + new BigInteger("18049583422636032"), + new BigInteger("145241105196122112"), + new BigInteger("362539804446949376"), + new BigInteger("725361088165576704"), + new BigInteger("1450722176331153408"), + new BigInteger("2901444352662306816"), + new BigInteger("5802888705324613632"), + new BigInteger("11533718717099671552"), + new BigInteger("4620693356194824192"), + new BigInteger("288234782788157440"), + new BigInteger("576469569871282176"), + new BigInteger("1224997833292120064"), + new BigInteger("2449995666584240128"), + new BigInteger("4899991333168480256"), + new BigInteger("9799982666336960512"), + new BigInteger("1152939783987658752"), + new BigInteger("2305878468463689728"), + new BigInteger("1128098930098176"), + new BigInteger("2257297371824128"), + new BigInteger("4796069720358912"), + new BigInteger("9592139440717824"), + new BigInteger("19184278881435648"), + new BigInteger("38368557762871296"), + new BigInteger("4679521487814656"), + new BigInteger("9077567998918656"), + }; + public static final BigInteger[][] BISHOP_ATTACKS = { + { + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1"), + new BigInteger("2"), + new BigInteger("4"), + new BigInteger("8"), + new BigInteger("16"), + new BigInteger("32"), + new BigInteger("64"), + new BigInteger("0"), + new BigInteger("256"), + new BigInteger("513"), + new BigInteger("1026"), + new BigInteger("2052"), + new BigInteger("4104"), + new BigInteger("8208"), + new BigInteger("16416"), + new BigInteger("0"), + new BigInteger("65536"), + new BigInteger("131328"), + new BigInteger("262657"), + new BigInteger("525314"), + new BigInteger("1050628"), + new BigInteger("2101256"), + new BigInteger("4202512"), + new BigInteger("0"), + new BigInteger("16777216"), + new BigInteger("33619968"), + new BigInteger("67240192"), + new BigInteger("134480385"), + new BigInteger("268960770"), + new BigInteger("537921540"), + new BigInteger("1075843080"), + new BigInteger("0"), + new BigInteger("4294967296"), + new BigInteger("8606711808"), + new BigInteger("17213489152"), + new BigInteger("34426978560"), + new BigInteger("68853957121"), + new BigInteger("137707914242"), + new BigInteger("275415828484"), + new BigInteger("0"), + new BigInteger("1099511627776"), + new BigInteger("2203318222848"), + new BigInteger("4406653222912"), + new BigInteger("8813306511360"), + new BigInteger("17626613022976"), + new BigInteger("35253226045953"), + new BigInteger("70506452091906"), + new BigInteger("0"), + new BigInteger("281474976710656"), + new BigInteger("564049465049088"), + new BigInteger("1128103225065472"), + new BigInteger("2256206466908160"), + new BigInteger("4512412933881856"), + new BigInteger("9024825867763968"), + new BigInteger("18049651735527937"), + }, + { + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("2"), + new BigInteger("4"), + new BigInteger("8"), + new BigInteger("16"), + new BigInteger("32"), + new BigInteger("64"), + new BigInteger("128"), + new BigInteger("0"), + new BigInteger("516"), + new BigInteger("1032"), + new BigInteger("2064"), + new BigInteger("4128"), + new BigInteger("8256"), + new BigInteger("16512"), + new BigInteger("32768"), + new BigInteger("0"), + new BigInteger("132104"), + new BigInteger("264208"), + new BigInteger("528416"), + new BigInteger("1056832"), + new BigInteger("2113664"), + new BigInteger("4227072"), + new BigInteger("8388608"), + new BigInteger("0"), + new BigInteger("33818640"), + new BigInteger("67637280"), + new BigInteger("135274560"), + new BigInteger("270549120"), + new BigInteger("541097984"), + new BigInteger("1082130432"), + new BigInteger("2147483648"), + new BigInteger("0"), + new BigInteger("8657571872"), + new BigInteger("17315143744"), + new BigInteger("34630287488"), + new BigInteger("69260574720"), + new BigInteger("138521083904"), + new BigInteger("277025390592"), + new BigInteger("549755813888"), + new BigInteger("0"), + new BigInteger("2216338399296"), + new BigInteger("4432676798592"), + new BigInteger("8865353596928"), + new BigInteger("17730707128320"), + new BigInteger("35461397479424"), + new BigInteger("70918499991552"), + new BigInteger("140737488355328"), + new BigInteger("0"), + new BigInteger("567382630219904"), + new BigInteger("1134765260439552"), + new BigInteger("2269530520813568"), + new BigInteger("4539061024849920"), + new BigInteger("9078117754732544"), + new BigInteger("18155135997837312"), + new BigInteger("36028797018963968"), + new BigInteger("0"), + }, + { + new BigInteger("0"), + new BigInteger("256"), + new BigInteger("66048"), + new BigInteger("16909312"), + new BigInteger("4328785920"), + new BigInteger("1108169199616"), + new BigInteger("283691315109888"), + new BigInteger("72624976668147712"), + new BigInteger("0"), + new BigInteger("65536"), + new BigInteger("16908288"), + new BigInteger("4328783872"), + new BigInteger("1108169195520"), + new BigInteger("283691315101696"), + new BigInteger("72624976668131328"), + new BigInteger("145249953336262656"), + new BigInteger("0"), + new BigInteger("16777216"), + new BigInteger("4328521728"), + new BigInteger("1108168671232"), + new BigInteger("283691314053120"), + new BigInteger("72624976666034176"), + new BigInteger("145249953332068352"), + new BigInteger("290499906664136704"), + new BigInteger("0"), + new BigInteger("4294967296"), + new BigInteger("1108101562368"), + new BigInteger("283691179835392"), + new BigInteger("72624976397598720"), + new BigInteger("145249952795197440"), + new BigInteger("290499905590394880"), + new BigInteger("580999811180789760"), + new BigInteger("0"), + new BigInteger("1099511627776"), + new BigInteger("283673999966208"), + new BigInteger("72624942037860352"), + new BigInteger("145249884075720704"), + new BigInteger("290499768151441408"), + new BigInteger("580999536302882816"), + new BigInteger("1161999072605765632"), + new BigInteger("0"), + new BigInteger("281474976710656"), + new BigInteger("72620543991349248"), + new BigInteger("145241087982698496"), + new BigInteger("290482175965396992"), + new BigInteger("580964351930793984"), + new BigInteger("1161928703861587968"), + new BigInteger("2323857407723175936"), + new BigInteger("0"), + new BigInteger("72057594037927936"), + new BigInteger("144115188075855872"), + new BigInteger("288230376151711744"), + new BigInteger("576460752303423488"), + new BigInteger("1152921504606846976"), + new BigInteger("2305843009213693952"), + new BigInteger("4611686018427387904"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + }, + { + new BigInteger("9241421688590303744"), + new BigInteger("36099303471055872"), + new BigInteger("141012904183808"), + new BigInteger("550831656960"), + new BigInteger("2151686144"), + new BigInteger("8404992"), + new BigInteger("32768"), + new BigInteger("0"), + new BigInteger("4620710844295151616"), + new BigInteger("9241421688590303232"), + new BigInteger("36099303471054848"), + new BigInteger("141012904181760"), + new BigInteger("550831652864"), + new BigInteger("2151677952"), + new BigInteger("8388608"), + new BigInteger("0"), + new BigInteger("2310355422147510272"), + new BigInteger("4620710844295020544"), + new BigInteger("9241421688590041088"), + new BigInteger("36099303470530560"), + new BigInteger("141012903133184"), + new BigInteger("550829555712"), + new BigInteger("2147483648"), + new BigInteger("0"), + new BigInteger("1155177711056977920"), + new BigInteger("2310355422113955840"), + new BigInteger("4620710844227911680"), + new BigInteger("9241421688455823360"), + new BigInteger("36099303202095104"), + new BigInteger("141012366262272"), + new BigInteger("549755813888"), + new BigInteger("0"), + new BigInteger("577588851233521664"), + new BigInteger("1155177702467043328"), + new BigInteger("2310355404934086656"), + new BigInteger("4620710809868173312"), + new BigInteger("9241421619736346624"), + new BigInteger("36099165763141632"), + new BigInteger("140737488355328"), + new BigInteger("0"), + new BigInteger("288793326105133056"), + new BigInteger("577586652210266112"), + new BigInteger("1155173304420532224"), + new BigInteger("2310346608841064448"), + new BigInteger("4620693217682128896"), + new BigInteger("9241386435364257792"), + new BigInteger("36028797018963968"), + new BigInteger("0"), + new BigInteger("144115188075855872"), + new BigInteger("288230376151711744"), + new BigInteger("576460752303423488"), + new BigInteger("1152921504606846976"), + new BigInteger("2305843009213693952"), + new BigInteger("4611686018427387904"), + new BigInteger("9223372036854775808"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + + }, + }; + public static final BigInteger[][] ROOK_ATTACKS = { + { + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("1"), + new BigInteger("2"), + new BigInteger("4"), + new BigInteger("8"), + new BigInteger("16"), + new BigInteger("32"), + new BigInteger("64"), + new BigInteger("128"), + new BigInteger("257"), + new BigInteger("514"), + new BigInteger("1028"), + new BigInteger("2056"), + new BigInteger("4112"), + new BigInteger("8224"), + new BigInteger("16448"), + new BigInteger("32896"), + new BigInteger("65793"), + new BigInteger("131586"), + new BigInteger("263172"), + new BigInteger("526344"), + new BigInteger("1052688"), + new BigInteger("2105376"), + new BigInteger("4210752"), + new BigInteger("8421504"), + new BigInteger("16843009"), + new BigInteger("33686018"), + new BigInteger("67372036"), + new BigInteger("134744072"), + new BigInteger("269488144"), + new BigInteger("538976288"), + new BigInteger("1077952576"), + new BigInteger("2155905152"), + new BigInteger("4311810305"), + new BigInteger("8623620610"), + new BigInteger("17247241220"), + new BigInteger("34494482440"), + new BigInteger("68988964880"), + new BigInteger("137977929760"), + new BigInteger("275955859520"), + new BigInteger("551911719040"), + new BigInteger("1103823438081"), + new BigInteger("2207646876162"), + new BigInteger("4415293752324"), + new BigInteger("8830587504648"), + new BigInteger("17661175009296"), + new BigInteger("35322350018592"), + new BigInteger("70644700037184"), + new BigInteger("141289400074368"), + new BigInteger("282578800148737"), + new BigInteger("565157600297474"), + new BigInteger("1130315200594948"), + new BigInteger("2260630401189896"), + new BigInteger("4521260802379792"), + new BigInteger("9042521604759584"), + new BigInteger("18085043209519168"), + new BigInteger("36170086419038336") + }, + { + new BigInteger("254"), + new BigInteger("252"), + new BigInteger("248"), + new BigInteger("240"), + new BigInteger("224"), + new BigInteger("192"), + new BigInteger("128"), + new BigInteger("0"), + new BigInteger("65024"), + new BigInteger("64512"), + new BigInteger("63488"), + new BigInteger("61440"), + new BigInteger("57344"), + new BigInteger("49152"), + new BigInteger("32768"), + new BigInteger("0"), + new BigInteger("16646144"), + new BigInteger("16515072"), + new BigInteger("16252928"), + new BigInteger("15728640"), + new BigInteger("14680064"), + new BigInteger("12582912"), + new BigInteger("8388608"), + new BigInteger("0"), + new BigInteger("4261412864"), + new BigInteger("4227858432"), + new BigInteger("4160749568"), + new BigInteger("4026531840"), + new BigInteger("3758096384"), + new BigInteger("3221225472"), + new BigInteger("2147483648"), + new BigInteger("0"), + new BigInteger("1090921693184"), + new BigInteger("1082331758592"), + new BigInteger("1065151889408"), + new BigInteger("1030792151040"), + new BigInteger("962072674304"), + new BigInteger("824633720832"), + new BigInteger("549755813888"), + new BigInteger("0"), + new BigInteger("279275953455104"), + new BigInteger("277076930199552"), + new BigInteger("272678883688448"), + new BigInteger("263882790666240"), + new BigInteger("246290604621824"), + new BigInteger("211106232532992"), + new BigInteger("140737488355328"), + new BigInteger("0"), + new BigInteger("71494644084506624"), + new BigInteger("70931694131085312"), + new BigInteger("69805794224242688"), + new BigInteger("67553994410557440"), + new BigInteger("63050394783186944"), + new BigInteger("54043195528445952"), + new BigInteger("36028797018963968"), + new BigInteger("0"), + new BigInteger("18302628885633695744"), + new BigInteger("18158513697557839872"), + new BigInteger("17870283321406128128"), + new BigInteger("17293822569102704640"), + new BigInteger("16140901064495857664"), + new BigInteger("13835058055282163712"), + new BigInteger("9223372036854775808"), + new BigInteger("0") + }, + { + new BigInteger("72340172838076672"), + new BigInteger("144680345676153344"), + new BigInteger("289360691352306688"), + new BigInteger("578721382704613376"), + new BigInteger("1157442765409226752"), + new BigInteger("2314885530818453504"), + new BigInteger("4629771061636907008"), + new BigInteger("9259542123273814016"), + new BigInteger("72340172838076416"), + new BigInteger("144680345676152832"), + new BigInteger("289360691352305664"), + new BigInteger("578721382704611328"), + new BigInteger("1157442765409222656"), + new BigInteger("2314885530818445312"), + new BigInteger("4629771061636890624"), + new BigInteger("9259542123273781248"), + new BigInteger("72340172838010880"), + new BigInteger("144680345676021760"), + new BigInteger("289360691352043520"), + new BigInteger("578721382704087040"), + new BigInteger("1157442765408174080"), + new BigInteger("2314885530816348160"), + new BigInteger("4629771061632696320"), + new BigInteger("9259542123265392640"), + new BigInteger("72340172821233664"), + new BigInteger("144680345642467328"), + new BigInteger("289360691284934656"), + new BigInteger("578721382569869312"), + new BigInteger("1157442765139738624"), + new BigInteger("2314885530279477248"), + new BigInteger("4629771060558954496"), + new BigInteger("9259542121117908992"), + new BigInteger("72340168526266368"), + new BigInteger("144680337052532736"), + new BigInteger("289360674105065472"), + new BigInteger("578721348210130944"), + new BigInteger("1157442696420261888"), + new BigInteger("2314885392840523776"), + new BigInteger("4629770785681047552"), + new BigInteger("9259541571362095104"), + new BigInteger("72339069014638592"), + new BigInteger("144678138029277184"), + new BigInteger("289356276058554368"), + new BigInteger("578712552117108736"), + new BigInteger("1157425104234217472"), + new BigInteger("2314850208468434944"), + new BigInteger("4629700416936869888"), + new BigInteger("9259400833873739776"), + new BigInteger("72057594037927936"), + new BigInteger("144115188075855872"), + new BigInteger("288230376151711744"), + new BigInteger("576460752303423488"), + new BigInteger("1152921504606846976"), + new BigInteger("2305843009213693952"), + new BigInteger("4611686018427387904"), + new BigInteger("9223372036854775808"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0"), + new BigInteger("0") + }, + { + new BigInteger("0"), + new BigInteger("1"), + new BigInteger("3"), + new BigInteger("7"), + new BigInteger("15"), + new BigInteger("31"), + new BigInteger("63"), + new BigInteger("127"), + new BigInteger("0"), + new BigInteger("256"), + new BigInteger("768"), + new BigInteger("1792"), + new BigInteger("3840"), + new BigInteger("7936"), + new BigInteger("16128"), + new BigInteger("32512"), + new BigInteger("0"), + new BigInteger("65536"), + new BigInteger("196608"), + new BigInteger("458752"), + new BigInteger("983040"), + new BigInteger("2031616"), + new BigInteger("4128768"), + new BigInteger("8323072"), + new BigInteger("0"), + new BigInteger("16777216"), + new BigInteger("50331648"), + new BigInteger("117440512"), + new BigInteger("251658240"), + new BigInteger("520093696"), + new BigInteger("1056964608"), + new BigInteger("2130706432"), + new BigInteger("0"), + new BigInteger("4294967296"), + new BigInteger("12884901888"), + new BigInteger("30064771072"), + new BigInteger("64424509440"), + new BigInteger("133143986176"), + new BigInteger("270582939648"), + new BigInteger("545460846592"), + new BigInteger("0"), + new BigInteger("1099511627776"), + new BigInteger("3298534883328"), + new BigInteger("7696581394432"), + new BigInteger("16492674416640"), + new BigInteger("34084860461056"), + new BigInteger("69269232549888"), + new BigInteger("139637976727552"), + new BigInteger("0"), + new BigInteger("281474976710656"), + new BigInteger("844424930131968"), + new BigInteger("1970324836974592"), + new BigInteger("4222124650659840"), + new BigInteger("8725724278030336"), + new BigInteger("17732923532771328"), + new BigInteger("35747322042253312"), + new BigInteger("0"), + new BigInteger("72057594037927936"), + new BigInteger("216172782113783808"), + new BigInteger("504403158265495552"), + new BigInteger("1080863910568919040"), + new BigInteger("2233785415175766016"), + new BigInteger("4539628424389459968"), + new BigInteger("9151314442816847872") + } + }; + + public static final BigInteger[] WHITE_PAWN_ATTACKS = { + BigInteger.valueOf(0), + BigInteger.valueOf(0), + BigInteger.valueOf(0), + BigInteger.valueOf(0), + BigInteger.valueOf(0), + BigInteger.valueOf(0), + BigInteger.valueOf(0), + BigInteger.valueOf(0), + BigInteger.valueOf(2), + BigInteger.valueOf(5), + BigInteger.valueOf(10), + BigInteger.valueOf(20), + BigInteger.valueOf(40), + BigInteger.valueOf(80), + BigInteger.valueOf(160), + BigInteger.valueOf(64), + BigInteger.valueOf(512), + BigInteger.valueOf(1280), + BigInteger.valueOf(2560), + BigInteger.valueOf(5120), + BigInteger.valueOf(10240), + BigInteger.valueOf(20480), + BigInteger.valueOf(40960), + BigInteger.valueOf(16384), + BigInteger.valueOf(131072), + BigInteger.valueOf(327680), + BigInteger.valueOf(655360), + BigInteger.valueOf(1310720), + BigInteger.valueOf(2621440), + BigInteger.valueOf(5242880), + BigInteger.valueOf(10485760), + BigInteger.valueOf(4194304), + BigInteger.valueOf(33554432), + BigInteger.valueOf(83886080), + BigInteger.valueOf(167772160L), + BigInteger.valueOf(335544320L), + BigInteger.valueOf(671088640L), + BigInteger.valueOf(1342177280L), + BigInteger.valueOf(2684354560L), + BigInteger.valueOf(1073741824L), + BigInteger.valueOf(8589934592L), + BigInteger.valueOf(21474836480L), + BigInteger.valueOf(42949672960L), + BigInteger.valueOf(85899345920L), + BigInteger.valueOf(171798691840L), + BigInteger.valueOf(343597383680L), + BigInteger.valueOf(687194767360L), + BigInteger.valueOf(274877906944L), + BigInteger.valueOf(2199023255552L), + BigInteger.valueOf(5497558138880L), + BigInteger.valueOf(10995116277760L), + BigInteger.valueOf(21990232555520L), + BigInteger.valueOf(43980465111040L), + BigInteger.valueOf(87960930222080L), + BigInteger.valueOf(175921860444160L), + BigInteger.valueOf(70368744177664L), + BigInteger.valueOf(562949953421312L), + BigInteger.valueOf(1407374883553280L), + BigInteger.valueOf(2814749767106560L), + BigInteger.valueOf(5629499534213120L), + BigInteger.valueOf(11258999068426240L), + BigInteger.valueOf(22517998136852480L), + BigInteger.valueOf(45035996273704960L), + BigInteger.valueOf(18014398509481984L) + }; + public static final BigInteger[] BLACK_PAWN_ATTACKS = { + BigInteger.valueOf(512), + BigInteger.valueOf(1280), + BigInteger.valueOf(2560), + BigInteger.valueOf(5120), + BigInteger.valueOf(10240), + BigInteger.valueOf(20480), + BigInteger.valueOf(40960), + BigInteger.valueOf(16384), + BigInteger.valueOf(131072), + BigInteger.valueOf(327680), + BigInteger.valueOf(655360), + BigInteger.valueOf(1310720), + BigInteger.valueOf(2621440), + BigInteger.valueOf(5242880), + BigInteger.valueOf(10485760), + BigInteger.valueOf(4194304), + BigInteger.valueOf(33554432), + BigInteger.valueOf(83886080), + BigInteger.valueOf(167772160), + BigInteger.valueOf(335544320), + BigInteger.valueOf(671088640), + BigInteger.valueOf(1342177280), + BigInteger.valueOf(2684354560L), + BigInteger.valueOf(1073741824), + BigInteger.valueOf(8589934592L), + BigInteger.valueOf(21474836480L), + BigInteger.valueOf(42949672960L), + BigInteger.valueOf(85899345920L), + BigInteger.valueOf(171798691840L), + BigInteger.valueOf(343597383680L), + BigInteger.valueOf(687194767360L), + BigInteger.valueOf(274877906944L), + BigInteger.valueOf(2199023255552L), + BigInteger.valueOf(5497558138880L), + BigInteger.valueOf(10995116277760L), + BigInteger.valueOf(21990232555520L), + BigInteger.valueOf(43980465111040L), + BigInteger.valueOf(87960930222080L), + BigInteger.valueOf(175921860444160L), + BigInteger.valueOf(70368744177664L), + BigInteger.valueOf(562949953421312L), + BigInteger.valueOf(1407374883553280L), + BigInteger.valueOf(2814749767106560L), + BigInteger.valueOf(5629499534213120L), + BigInteger.valueOf(11258999068426240L), + BigInteger.valueOf(22517998136852480L), + BigInteger.valueOf(45035996273704960L), + BigInteger.valueOf(18014398509481984L), + BigInteger.valueOf(144115188075855872L), + BigInteger.valueOf(360287970189639680L), + BigInteger.valueOf(720575940379279360L), + BigInteger.valueOf(1441151880758558720L), + BigInteger.valueOf(2882303761517117440L), + BigInteger.valueOf(5764607523034234880L), + new BigInteger("11529215046068469760"), + BigInteger.valueOf(4611686018427387904L), + BigInteger.valueOf(0), + BigInteger.valueOf(0), + BigInteger.valueOf(0), + BigInteger.valueOf(0), + BigInteger.valueOf(0), + BigInteger.valueOf(0), + BigInteger.valueOf(0), + BigInteger.valueOf(0) + }; + + public static final BigInteger[] KING_ATTACKS = { + new BigInteger("770"), + new BigInteger("1797"), + new BigInteger("3594"), + new BigInteger("7188"), + new BigInteger("14376"), + new BigInteger("28752"), + new BigInteger("57504"), + new BigInteger("49216"), + new BigInteger("197123"), + new BigInteger("460039"), + new BigInteger("920078"), + new BigInteger("1840156"), + new BigInteger("3680312"), + new BigInteger("7360624"), + new BigInteger("14721248"), + new BigInteger("12599488"), + new BigInteger("50463488"), + new BigInteger("117769984"), + new BigInteger("235539968"), + new BigInteger("471079936"), + new BigInteger("942159872"), + new BigInteger("1884319744"), + new BigInteger("3768639488"), + new BigInteger("3225468928"), + new BigInteger("12918652928"), + new BigInteger("30149115904"), + new BigInteger("60298231808"), + new BigInteger("120596463616"), + new BigInteger("241192927232"), + new BigInteger("482385854464"), + new BigInteger("964771708928"), + new BigInteger("825720045568"), + new BigInteger("3307175149568"), + new BigInteger("7718173671424"), + new BigInteger("15436347342848"), + new BigInteger("30872694685696"), + new BigInteger("61745389371392"), + new BigInteger("123490778742784"), + new BigInteger("246981557485568"), + new BigInteger("211384331665408"), + new BigInteger("846636838289408"), + new BigInteger("1975852459884544"), + new BigInteger("3951704919769088"), + new BigInteger("7903409839538176"), + new BigInteger("15806819679076352"), + new BigInteger("31613639358152704"), + new BigInteger("63227278716305408"), + new BigInteger("54114388906344448"), + new BigInteger("216739030602088448"), + new BigInteger("505818229730443264"), + new BigInteger("1011636459460886528"), + new BigInteger("2023272918921773056"), + new BigInteger("4046545837843546112"), + new BigInteger("8093091675687092224"), + new BigInteger("16186183351374184448"), + new BigInteger("13853283560024178688"), + new BigInteger("144959613005987840"), + new BigInteger("362258295026614272"), + new BigInteger("724516590053228544"), + new BigInteger("1449033180106457088"), + new BigInteger("2898066360212914176"), + new BigInteger("5796132720425828352"), + new BigInteger("11592265440851656704"), + new BigInteger("4665729213955833856") + }; + + public static final BigInteger[] SQUARE_BBS = { + new BigInteger("1"), + new BigInteger("2"), + new BigInteger("4"), + new BigInteger("8"), + new BigInteger("16"), + new BigInteger("32"), + new BigInteger("64"), + new BigInteger("128"), + new BigInteger("256"), + new BigInteger("512"), + new BigInteger("1024"), + new BigInteger("2048"), + new BigInteger("4096"), + new BigInteger("8192"), + new BigInteger("16384"), + new BigInteger("32768"), + new BigInteger("65536"), + new BigInteger("131072"), + new BigInteger("262144"), + new BigInteger("524288"), + new BigInteger("1048576"), + new BigInteger("2097152"), + new BigInteger("4194304"), + new BigInteger("8388608"), + new BigInteger("16777216"), + new BigInteger("33554432"), + new BigInteger("67108864"), + new BigInteger("134217728"), + new BigInteger("268435456"), + new BigInteger("536870912"), + new BigInteger("1073741824"), + new BigInteger("2147483648"), + new BigInteger("4294967296"), + new BigInteger("8589934592"), + new BigInteger("17179869184"), + new BigInteger("34359738368"), + new BigInteger("68719476736"), + new BigInteger("137438953472"), + new BigInteger("274877906944"), + new BigInteger("549755813888"), + new BigInteger("1099511627776"), + new BigInteger("2199023255552"), + new BigInteger("4398046511104"), + new BigInteger("8796093022208"), + new BigInteger("17592186044416"), + new BigInteger("35184372088832"), + new BigInteger("70368744177664"), + new BigInteger("140737488355328"), + new BigInteger("281474976710656"), + new BigInteger("562949953421312"), + new BigInteger("1125899906842624"), + new BigInteger("2251799813685248"), + new BigInteger("4503599627370496"), + new BigInteger("9007199254740992"), + new BigInteger("18014398509481984"), + new BigInteger("36028797018963968"), + new BigInteger("72057594037927936"), + new BigInteger("144115188075855872"), + new BigInteger("288230376151711744"), + new BigInteger("576460752303423488"), + new BigInteger("1152921504606846976"), + new BigInteger("2305843009213693952"), + new BigInteger("4611686018427387904"), + new BigInteger("9223372036854775808"), + }; + + //#endregion + +} \ No newline at end of file diff --git a/Java/MoveUtils.java b/Java/MoveUtils.java new file mode 100644 index 0000000..f8de6e9 --- /dev/null +++ b/Java/MoveUtils.java @@ -0,0 +1,245 @@ +import java.math.BigInteger; + +public class MoveUtils +{ + + static final int BISHOP_UP_LEFT = 0; + static final int BISHOP_UP_RIGHT = 1; + static final int BISHOP_DOWN_LEFT = 2; + static final int BISHOP_DOWN_RIGHT = 3; + + static final int ROOK_UP = 0; + static final int ROOK_DOWN = 2; + static final int ROOK_LEFT = 3; + static final int ROOK_RIGHT = 1; + + public static int BitScanForward(BigInteger bitboard) + { + int index = 0; + while (bitboard.and(BigInteger.ONE.shiftLeft(index)).equals(BigInteger.ZERO)) + { + index++; + } + return index; + } + + public static BigInteger GetRookMovesSeparate(BigInteger combined_occ, int square) + { + BigInteger combinedAttacks = BigInteger.ZERO; + + BigInteger rookAttackUp = MoveConstants.ROOK_ATTACKS[ROOK_UP][square]; + BigInteger rookAndOccs = rookAttackUp.and(combined_occ); + if (!rookAndOccs.equals(BigInteger.ZERO)) + { + BigInteger lastValue = rookAndOccs; + for (int i = 0; i < 8; i++) + { + rookAndOccs = rookAndOccs.and(rookAndOccs.subtract(BigInteger.ONE)); + if (rookAndOccs.equals(BigInteger.ZERO)) + { + int endSquare = BitScanForward(lastValue); // Implement this method + combinedAttacks = combinedAttacks.or(Inb.INBETWEEN_BITBOARDS[square][endSquare]); + break; + } + lastValue = rookAndOccs; + } + } + else + { + combinedAttacks = combinedAttacks.or(rookAttackUp); + } + // Pr.println("Rook up"); + //Pr.printBigIntegerLn(combinedAttacks); + + BigInteger rookAttackLeft = MoveConstants.ROOK_ATTACKS[ROOK_LEFT][square]; + rookAndOccs = rookAttackLeft.and(combined_occ); + if (!rookAndOccs.equals(BigInteger.ZERO)) + { + BigInteger lastValue = rookAndOccs; + for (int i = 0; i < 8; i++) + { + rookAndOccs = rookAndOccs.and(rookAndOccs.subtract(BigInteger.ONE)); + if (rookAndOccs.equals(BigInteger.ZERO)) + { + int endSquare = BitScanForward(lastValue); // Implement this method + combinedAttacks = combinedAttacks.or(Inb.INBETWEEN_BITBOARDS[square][endSquare]); + break; + } + lastValue = rookAndOccs; + } + } + else + { + combinedAttacks = combinedAttacks.or(rookAttackLeft); + } + //Pr.println("Rook left"); + //Pr.printBigIntegerLn(combinedAttacks); + + BigInteger rookAttackDown = MoveConstants.ROOK_ATTACKS[ROOK_DOWN][square]; + rookAndOccs = rookAttackDown.and(combined_occ); + if (!rookAndOccs.equals(BigInteger.ZERO)) + { + int endSquare = BitScanForward(rookAndOccs); // Implement this method + combinedAttacks = combinedAttacks.or(Inb.INBETWEEN_BITBOARDS[square][endSquare]); + } + else + { + combinedAttacks = combinedAttacks.or(rookAttackDown); + } + // Pr.println("Rook down"); + // Pr.printBigIntegerLn(combinedAttacks); + + BigInteger rookAttackRight = MoveConstants.ROOK_ATTACKS[ROOK_RIGHT][square]; + rookAndOccs = rookAttackRight.and(combined_occ); + if (!rookAndOccs.equals(BigInteger.ZERO)) + { + int endSquare = BitScanForward(rookAndOccs); // Implement this method + combinedAttacks = combinedAttacks.or(Inb.INBETWEEN_BITBOARDS[square][endSquare]); + } + else + { + combinedAttacks = combinedAttacks.or(rookAttackRight); + } + // Pr.println("Rook right"); + // Pr.printBigIntegerLn(combinedAttacks); + + return combinedAttacks; + } + + public static BigInteger GetBishopMovesSeparate(BigInteger combined_occ, int square) + { + + //Pr.printIntLn(square); + //Pr.printSquareLn(square); + + BigInteger combinedAttacks = BigInteger.ZERO; + + BigInteger bishopAttackUpLeft = MoveConstants.BISHOP_ATTACKS[BISHOP_UP_LEFT][square]; + BigInteger bishopAndOccs = bishopAttackUpLeft.and(combined_occ); + if (!bishopAndOccs.equals(BigInteger.ZERO)) { + BigInteger lastValue = bishopAndOccs; + for (int i = 0; i < 8; i++) { + bishopAndOccs = bishopAndOccs.and(bishopAndOccs.subtract(BigInteger.ONE)); + if (bishopAndOccs.equals(BigInteger.ZERO)) { + int endSquare = BitScanForward(lastValue); // Implement this method + combinedAttacks = combinedAttacks.or(Inb.INBETWEEN_BITBOARDS[square][endSquare]); + break; + } + lastValue = bishopAndOccs; + } + } else { + combinedAttacks = combinedAttacks.or(bishopAttackUpLeft); + } + // Pr.println("Bishop up left"); + //Pr.printBigIntegerLn(combinedAttacks); + + BigInteger bishopAttackUpRight = MoveConstants.BISHOP_ATTACKS[BISHOP_UP_RIGHT][square]; + bishopAndOccs = bishopAttackUpRight.and(combined_occ); + if (!bishopAndOccs.equals(BigInteger.ZERO)) { + BigInteger lastValue = bishopAndOccs; + for (int i = 0; i < 8; i++) { + bishopAndOccs = bishopAndOccs.and(bishopAndOccs.subtract(BigInteger.ONE)); + if (bishopAndOccs.equals(BigInteger.ZERO)) { + int endSquare = BitScanForward(lastValue); // Implement this method + combinedAttacks = combinedAttacks.or(Inb.INBETWEEN_BITBOARDS[square][endSquare]); + break; + } + lastValue = bishopAndOccs; + } + } else { + combinedAttacks = combinedAttacks.or(bishopAttackUpRight); + } + // Pr.println("Bishop up right"); + // Pr.printBigIntegerLn(combinedAttacks); + + BigInteger bishopAttackDownLeft = MoveConstants.BISHOP_ATTACKS[BISHOP_DOWN_LEFT][square]; + + // Pr.println("down left bitboard"); + // Pr.printBigIntegerLn(bishopAttackDownLeft); + // Pr.println("__________"); + + bishopAndOccs = bishopAttackDownLeft.and(combined_occ); + if (!bishopAndOccs.equals(BigInteger.ZERO)) { + int endSquare = BitScanForward(bishopAndOccs); // Implement this method + combinedAttacks = combinedAttacks.or(Inb.INBETWEEN_BITBOARDS[square][endSquare]); + } else { + combinedAttacks = combinedAttacks.or(bishopAttackDownLeft); + } + // Pr.println("Bishop down left"); + // Pr.printBigIntegerLn(combinedAttacks); + + BigInteger bishopAttackDownRight = MoveConstants.BISHOP_ATTACKS[BISHOP_DOWN_RIGHT][square]; + bishopAndOccs = bishopAttackDownRight.and(combined_occ); + if (!bishopAndOccs.equals(BigInteger.ZERO)) { + int endSquare = BitScanForward(bishopAndOccs); // Implement this method + combinedAttacks = combinedAttacks.or(Inb.INBETWEEN_BITBOARDS[square][endSquare]); + } else { + combinedAttacks = combinedAttacks.or(bishopAttackDownRight); + } + // Pr.println("Bishop down right"); + // Pr.printBigIntegerLn(combinedAttacks); + return combinedAttacks; + } + + public static Boolean Is_Square_Attacked_By_Black_Global(int square, BigInteger occupancy) + { + + if (Board.bitboard_array_global[GenConst.BP].and(MoveConstants.WHITE_PAWN_ATTACKS[square]).signum() != 0) { + return true; + } + if (Board.bitboard_array_global[GenConst.BN].and(MoveConstants.KNIGHT_ATTACKS[square]).signum() != 0) { + return true; + } + if (Board.bitboard_array_global[GenConst.BK].and(MoveConstants.KING_ATTACKS[square]).signum() != 0) { + return true; + } + BigInteger bishopAttacks = MoveUtils.GetBishopMovesSeparate(occupancy, square); + if (Board.bitboard_array_global[GenConst.BB].and(bishopAttacks).signum() != 0) { + return true; + } + if (Board.bitboard_array_global[GenConst.BQ].and(bishopAttacks).signum() != 0) { + return true; + } + BigInteger rookAttacks = MoveUtils.GetRookMovesSeparate(occupancy, square); + if (Board.bitboard_array_global[GenConst.BR].and(rookAttacks).signum() != 0) { + return true; + } + if (Board.bitboard_array_global[GenConst.BQ].and(rookAttacks).signum() != 0) { + return true; + } + + return false; + } + + + public static Boolean Is_Square_Attacked_By_White_Global(int square, BigInteger occupancy) + { + + if (Board.bitboard_array_global[GenConst.WP].and(MoveConstants.BLACK_PAWN_ATTACKS[square]).signum() != 0) { + return true; + } + if (Board.bitboard_array_global[GenConst.WN].and(MoveConstants.KNIGHT_ATTACKS[square]).signum() != 0) { + return true; + } + if (Board.bitboard_array_global[GenConst.WK].and(MoveConstants.KING_ATTACKS[square]).signum() != 0) { + return true; + } + BigInteger bishopAttacks = MoveUtils.GetBishopMovesSeparate(occupancy, square); + if (Board.bitboard_array_global[GenConst.WB].and(bishopAttacks).signum() != 0) { + return true; + } + if (Board.bitboard_array_global[GenConst.WQ].and(bishopAttacks).signum() != 0) { + return true; + } + BigInteger rookAttacks = MoveUtils.GetRookMovesSeparate(occupancy, square); + if (Board.bitboard_array_global[GenConst.WR].and(rookAttacks).signum() != 0) { + return true; + } + if (Board.bitboard_array_global[GenConst.WQ].and(rookAttacks).signum() != 0) { + return true; + } + + return false; + } + +} diff --git a/Java/Perft.java b/Java/Perft.java new file mode 100644 index 0000000..171e9ec --- /dev/null +++ b/Java/Perft.java @@ -0,0 +1,4133 @@ + +import java.math.BigInteger; + + +public class Perft +{ + + static Boolean OutOfBounds(int move) { + + if (move < 0) { + return true; + } + if (move > 63) { + return true; + } + return false; + } + + static void PrintMoveNoNL(int starting, int target_square, int tag) { //starting + + // Print starting + if (OutOfBounds(starting)) { + System.out.printf("%d", starting); + } else { + System.out.printf("%c%c", GenConst.SQ_CHAR_X[starting], GenConst.SQ_CHAR_Y[starting]); + } + + // Print target + if (OutOfBounds(target_square)) { + System.out.printf("%d", target_square); + } else { + System.out.printf("%c%c", GenConst.SQ_CHAR_X[target_square], GenConst.SQ_CHAR_Y[target_square]); + } + + // Print promotion tag + switch (tag) { + case GenConst.TAG_BCaptureKnightPromotion: + case GenConst.TAG_BKnightPromotion: + case GenConst.TAG_WKnightPromotion: + case GenConst.TAG_WCaptureKnightPromotion: + System.out.printf("n"); + break; + case GenConst.TAG_BCaptureRookPromotion: + case GenConst.TAG_BRookPromotion: + case GenConst.TAG_WRookPromotion: + case GenConst.TAG_WCaptureRookPromotion: + System.out.printf("r"); + break; + case GenConst.TAG_BCaptureBishopPromotion: + case GenConst.TAG_BBishopPromotion: + case GenConst.TAG_WBishopPromotion: + case GenConst.TAG_WCaptureBishopPromotion: + System.out.printf("b"); + break; + case GenConst.TAG_BCaptureQueenPromotion: + case GenConst.TAG_BQueenPromotion: + case GenConst.TAG_WQueenPromotion: + case GenConst.TAG_WCaptureQueenPromotion: + System.out.printf("q"); + break; + default: + break; + } + } + + static final int MOVE_STARTING = 0; + static final int MOVE_TARGET = 1; + static final int MOVE_PIECE = 2; + static final int MOVE_TAG = 3; + static final int NO_SQUARE = 64; + + static final int WKS_CASTLE_RIGHTS = 0; + static final int WQS_CASTLE_RIGHTS = 1; + static final int BKS_CASTLE_RIGHTS = 2; + static final int BQS_CASTLE_RIGHTS = 3; + + static final int PINNED_SQUARE_INDEX = 0; + static final int PINNING_PIECE_INDEX = 1; + + static final BigInteger WKS_EMPTY_BITBOARD = new BigInteger("6917529027641081856"); + static final BigInteger WQS_EMPTY_BITBOARD = new BigInteger("1008806316530991104"); + static final BigInteger BKS_EMPTY_BITBOARD = new BigInteger("96"); + static final BigInteger BQS_EMPTY_BITBOARD = new BigInteger("14"); + + static final BigInteger RANK_1_BITBOARD = new BigInteger( "18374686479671623680"); + static final BigInteger RANK_2_BITBOARD =new BigInteger( "71776119061217280"); + static final BigInteger RANK_3_BITBOARD =new BigInteger( "280375465082880"); + static final BigInteger RANK_4_BITBOARD =new BigInteger( "1095216660480"); + static final BigInteger RANK_5_BITBOARD =new BigInteger( "4278190080"); + static final BigInteger RANK_6_BITBOARD =new BigInteger( "16711680"); + static final BigInteger RANK_7_BITBOARD =new BigInteger( "65280"); + static final BigInteger RANK_8_BITBOARD =new BigInteger( "255"); + + static final BigInteger MAX_ULONG = new BigInteger("18446744073709551615"); + + static final BigInteger MAGIC = new BigInteger("285870213051386505"); + + static final int[] DEBRUIJN64 = + { + 0, 47, 1, 56, 48, 27, 2, 60, + 57, 49, 41, 37, 28, 16, 3, 61, + 54, 58, 35, 52, 50, 42, 21, 44, + 38, 32, 29, 23, 17, 11, 4, 62, + 46, 55, 26, 59, 40, 36, 15, 53, + 34, 51, 20, 43, 31, 22, 10, 45, + 25, 39, 14, 33, 19, 30, 9, 24, + 13, 18, 8, 12, 7, 6, 5, 63 + }; + + static int BitScanForward(BigInteger bitboard) { + + for (int i = 0; i < 64; i++) { + if (bitboard.testBit(i)) { + return i; + } + } + throw new AssertionError("Bitscanforward: bit not found"); + //BigInteger xorResult = bitboard.xor(bitboard.subtract(BigInteger.ONE)); + //BigInteger multiplied = xorResult.multiply(MAGIC); + //int index = multiplied.shiftRight(58).intValue(); + //return DEBRUIJN64[index]; + } + + static boolean isNotZero(BigInteger bitboard) { + return bitboard.signum() != 0; + } + + static boolean isZero(BigInteger bitboard) { + return bitboard.signum() == 0; + } + + static BigInteger removeBit(BigInteger bitboard) { + return bitboard.and(bitboard.subtract(BigInteger.ONE)); + } + + static void printMoveInfo(int startingSquare, int targetSquare, int tag, int piece) + { + Pr.println("\n Move Info:"); + Pr.print(" Starting Square: "); + Pr.printInt(startingSquare); + Pr.print(" "); + Pr.printSquareLn(startingSquare); + Pr.print(" Target Square: "); + Pr.printInt(targetSquare); + Pr.print(" "); + Pr.printSquareLn(targetSquare); + Pr.print(" Tag: "); + Pr.printIntLn(tag); + Pr.print(" Piece: "); + Pr.printIntLn(piece); + } + + + static int makeMove(int piece, int tag, int startingSquare, int targetSquare) + { + Pr.println("___make move____ piece: " + piece + " tag: " + tag + " startingSquare: " + startingSquare + " targetSquare: " + targetSquare); + assert piece >= GenConst.WP && piece <= GenConst.BK : "invalid piece: " + piece; + assert startingSquare >= 0 && startingSquare < 64 : "invalid starting square: " + startingSquare; + assert targetSquare >= 0 && targetSquare < 64 : "invalid target square: " + targetSquare; + + // printMoveInfo(startingSquare, targetSquare, tag, piece); + + int captureIndex = -1; + Board.is_white_global = !Board.is_white_global; + switch (tag) + { + case GenConst.TAG_NONE: //none + case GenConst.TAG_CHECK: //check + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + break; + case GenConst.TAG_CAPTURE: //capture + case GenConst.TAG_CHECK_CAPTURE: //check cap + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + if (piece >= GenConst.WP && piece <= GenConst.WK) + { + for (int i = GenConst.BP; i <= GenConst.BK; ++i) + { + if (targetSquare == 47) { + Pr.println(" board array: " + Board.bitboard_array_global[i]); + } + + if (isNotZero((Board.bitboard_array_global[i].and(MoveConstants.SQUARE_BBS[targetSquare])))) + { + captureIndex = i; + break; + } + } + assert captureIndex >= 0 && captureIndex <= 11 : "invalid capture index, capture"; + if (captureIndex < 0 || captureIndex > 11) + { + Pr.println("Invalid capture index: " + captureIndex); + } + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + } + else //is black + { + for (int i = GenConst.WP; i <= GenConst.WK; ++i) + { + if (isNotZero((Board.bitboard_array_global[i].and(MoveConstants.SQUARE_BBS[targetSquare])))) + { + captureIndex = i; + break; + } + } + assert captureIndex >= 0 && captureIndex <= 11 : "invalid capture index, capture"; + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + } + + Board.ep = NO_SQUARE; + break; + case GenConst.TAG_WHITEEP: //white ep + //move piece + Board.bitboard_array_global[GenConst.WP] =Board.bitboard_array_global[GenConst.WP].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[GenConst.WP] =Board.bitboard_array_global[GenConst.WP].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.bitboard_array_global[GenConst.BP] =Board.bitboard_array_global[GenConst.BP].and(MoveConstants.SQUARE_BBS[targetSquare + 8].not()); + Board.ep = NO_SQUARE; + break; + case GenConst.TAG_BLACKEP: //black ep + Board.bitboard_array_global[GenConst.BP] =Board.bitboard_array_global[GenConst.BP].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[GenConst.BP] =Board.bitboard_array_global[GenConst.BP].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.bitboard_array_global[GenConst.WP] =Board.bitboard_array_global[GenConst.WP].and(MoveConstants.SQUARE_BBS[targetSquare - 8].not()); + Board.ep = NO_SQUARE; + break; + + case GenConst.TAG_WCASTLEKS: //WKS + //white king + Board.bitboard_array_global[GenConst.WK] =Board.bitboard_array_global[GenConst.WK].or(MoveConstants.SQUARE_BBS[GenConst.G1]); + Board.bitboard_array_global[GenConst.WK] =Board.bitboard_array_global[GenConst.WK].and(MoveConstants.SQUARE_BBS[GenConst.E1].not()); + Board.bitboard_array_global[GenConst.WR] =Board.bitboard_array_global[GenConst.WR].or(MoveConstants.SQUARE_BBS[GenConst.F1]); + Board.bitboard_array_global[GenConst.WR] =Board.bitboard_array_global[GenConst.WR].and(MoveConstants.SQUARE_BBS[GenConst.H1].not()); + + Board.castle_rights_global[WKS_CASTLE_RIGHTS] = false; + Board.castle_rights_global[WQS_CASTLE_RIGHTS] = false; + Board.ep = NO_SQUARE; + break; + case GenConst.TAG_WCASTLEQS: //WQS + Board.bitboard_array_global[GenConst.WK] =Board.bitboard_array_global[GenConst.WK].or(MoveConstants.SQUARE_BBS[GenConst.C1]); + Board.bitboard_array_global[GenConst.WK] =Board.bitboard_array_global[GenConst.WK].and(MoveConstants.SQUARE_BBS[GenConst.E1].not()); + Board.bitboard_array_global[GenConst.WR] =Board.bitboard_array_global[GenConst.WR].or(MoveConstants.SQUARE_BBS[GenConst.D1]); + Board.bitboard_array_global[GenConst.WR] =Board.bitboard_array_global[GenConst.WR].and(MoveConstants.SQUARE_BBS[GenConst.A1].not()); + + Board.castle_rights_global[WKS_CASTLE_RIGHTS] = false; + Board.castle_rights_global[WQS_CASTLE_RIGHTS] = false; + Board.ep = NO_SQUARE; + break; + case GenConst.TAG_BCASTLEKS: //BKS + Board.bitboard_array_global[GenConst.BK] =Board.bitboard_array_global[GenConst.BK].or(MoveConstants.SQUARE_BBS[GenConst.G8]); + Board.bitboard_array_global[GenConst.BK] =Board.bitboard_array_global[GenConst.BK].and(MoveConstants.SQUARE_BBS[GenConst.E8].not()); + Board.bitboard_array_global[GenConst.BR] =Board.bitboard_array_global[GenConst.BR].or(MoveConstants.SQUARE_BBS[GenConst.F8]); + Board.bitboard_array_global[GenConst.BR] =Board.bitboard_array_global[GenConst.BR].and(MoveConstants.SQUARE_BBS[GenConst.H8].not()); + + Board.castle_rights_global[BKS_CASTLE_RIGHTS] = false; + Board.castle_rights_global[BQS_CASTLE_RIGHTS] = false; + Board.ep = NO_SQUARE; + break; + case GenConst.TAG_BCASTLEQS: //BQS + Board.bitboard_array_global[GenConst.BK] =Board.bitboard_array_global[GenConst.BK].or(MoveConstants.SQUARE_BBS[GenConst.C8]); + Board.bitboard_array_global[GenConst.BK] =Board.bitboard_array_global[GenConst.BK].and(MoveConstants.SQUARE_BBS[GenConst.E8].not()); + Board.bitboard_array_global[GenConst.BR] =Board.bitboard_array_global[GenConst.BR].or(MoveConstants.SQUARE_BBS[GenConst.D8]); + Board.bitboard_array_global[GenConst.BR] =Board.bitboard_array_global[GenConst.BR].and(MoveConstants.SQUARE_BBS[GenConst.A8].not()); + + Board.castle_rights_global[BKS_CASTLE_RIGHTS] = false; + Board.castle_rights_global[BQS_CASTLE_RIGHTS] = false; + Board.ep = NO_SQUARE; + break; + + case GenConst.TAG_BKnightPromotion: //BNPr + Board.bitboard_array_global[GenConst.BN] =Board.bitboard_array_global[GenConst.BN].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + break; + case GenConst.TAG_BBishopPromotion: //BBPr + Board.bitboard_array_global[GenConst.BB] =Board.bitboard_array_global[GenConst.BB].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + break; + case GenConst.TAG_BQueenPromotion: //BQPr + Board.bitboard_array_global[GenConst.BQ] =Board.bitboard_array_global[GenConst.BQ].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + break; + case GenConst.TAG_BRookPromotion: //BRPr + Board.bitboard_array_global[GenConst.BR] =Board.bitboard_array_global[GenConst.BR].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + break; + case 12: //WNPr + Board.bitboard_array_global[GenConst.WN] =Board.bitboard_array_global[GenConst.WN].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + break; + case 13: //WBPr + Board.bitboard_array_global[GenConst.WB] =Board.bitboard_array_global[GenConst.WB].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + break; + case 14: //WQPr + Board.bitboard_array_global[GenConst.WQ] =Board.bitboard_array_global[GenConst.WQ].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + break; + case 15: //WRPr + Board.bitboard_array_global[GenConst.WR] =Board.bitboard_array_global[GenConst.WR].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + break; + case 16: //BNPrCAP + Board.bitboard_array_global[GenConst.BN] =Board.bitboard_array_global[GenConst.BN].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + for (int i = GenConst.WP; i <= GenConst.WK; ++i) + { + if (isNotZero((Board.bitboard_array_global[i].and(MoveConstants.SQUARE_BBS[targetSquare])))) + { + captureIndex = i; + break; + } + } + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + + break; + case 17: //BBPrCAP + Board.bitboard_array_global[GenConst.BB] =Board.bitboard_array_global[GenConst.BB].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + for (int i = GenConst.WP; i <= GenConst.WK; ++i) + { + if (isNotZero((Board.bitboard_array_global[i].and(MoveConstants.SQUARE_BBS[targetSquare])))) + { + captureIndex = i; + break; + } + } + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + break; + case 18: //BQPrCAP + Board.bitboard_array_global[GenConst.BQ] =Board.bitboard_array_global[GenConst.BQ].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + for (int i = GenConst.WP; i <= GenConst.WK; ++i) + { + if (isNotZero((Board.bitboard_array_global[i].and(MoveConstants.SQUARE_BBS[targetSquare])))) + { + captureIndex = i; + break; + } + } + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + break; + case 19: //BRPrCAP + Board.bitboard_array_global[GenConst.BR] =Board.bitboard_array_global[GenConst.BR].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + for (int i = GenConst.WP; i <= GenConst.WK; ++i) + { + if (isNotZero((Board.bitboard_array_global[i].and(MoveConstants.SQUARE_BBS[targetSquare])))) + { + captureIndex = i; + break; + } + } + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + break; + case 20: //WNPrCAP + Board.bitboard_array_global[GenConst.WN] =Board.bitboard_array_global[GenConst.WN].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + for (int i = GenConst.BP; i <= GenConst.BK; ++i) + { + if (isNotZero((Board.bitboard_array_global[i].and(MoveConstants.SQUARE_BBS[targetSquare])))) + { + captureIndex = i; + break; + } + } + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + + break; + case 21: //WBPrCAP + Board.bitboard_array_global[GenConst.WB] =Board.bitboard_array_global[GenConst.WB].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + for (int i = GenConst.BP; i <= GenConst.BK; ++i) + { + if (isNotZero((Board.bitboard_array_global[i].and(MoveConstants.SQUARE_BBS[targetSquare])))) + { + captureIndex = i; + break; + } + } + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + + break; + case 22: //WQPrCAP + Board.bitboard_array_global[GenConst.WQ] =Board.bitboard_array_global[GenConst.WQ].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + for (int i = GenConst.BP; i <= GenConst.BK; ++i) + { + if (isNotZero((Board.bitboard_array_global[i].and(MoveConstants.SQUARE_BBS[targetSquare])))) + { + captureIndex = i; + break; + } + } + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + + break; + case 23: //WRPrCAP + Board.bitboard_array_global[GenConst.WR] =Board.bitboard_array_global[GenConst.WR].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + + Board.ep = NO_SQUARE; + for (int i = GenConst.BP; i <= GenConst.BK; i++) + { + if (isNotZero((Board.bitboard_array_global[i].and(MoveConstants.SQUARE_BBS[targetSquare])))) + { + captureIndex = i; + break; + } + } + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + break; + case 24: //WDouble + Board.bitboard_array_global[GenConst.WP] =Board.bitboard_array_global[GenConst.WP].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[GenConst.WP] =Board.bitboard_array_global[GenConst.WP].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = targetSquare + 8; + break; + case 25: //BDouble + Board.bitboard_array_global[GenConst.BP] =Board.bitboard_array_global[GenConst.BP].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[GenConst.BP] =Board.bitboard_array_global[GenConst.BP].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = targetSquare - 8; + break; + } + + if (piece == GenConst.WK) + { + Board.castle_rights_global[WKS_CASTLE_RIGHTS] = false; + Board.castle_rights_global[WQS_CASTLE_RIGHTS] = false; + } + else if (piece == GenConst.BK) + { + Board.castle_rights_global[BKS_CASTLE_RIGHTS] = false; + Board.castle_rights_global[BQS_CASTLE_RIGHTS] = false; + } + else if (piece == GenConst.WR) + { + if (Board.castle_rights_global[WKS_CASTLE_RIGHTS] == true) + { + if (isZero((Board.bitboard_array_global[GenConst.WR].and(MoveConstants.SQUARE_BBS[GenConst.H1])))) + { + Board.castle_rights_global[WKS_CASTLE_RIGHTS] = false; + } + } + if (Board.castle_rights_global[WQS_CASTLE_RIGHTS] == true) + { + if (isZero((Board.bitboard_array_global[GenConst.WR].and(MoveConstants.SQUARE_BBS[GenConst.A1])))) + { + Board.castle_rights_global[WQS_CASTLE_RIGHTS] = false; + } + } + } + else if (piece == GenConst.BR) + { + if (Board.castle_rights_global[BKS_CASTLE_RIGHTS] == true) + { + if (isZero((Board.bitboard_array_global[GenConst.BR].and(MoveConstants.SQUARE_BBS[GenConst.H8])))) + { + Board.castle_rights_global[BKS_CASTLE_RIGHTS] = false; + } + } + if (Board.castle_rights_global[BQS_CASTLE_RIGHTS] == true) + { + if (isZero((Board.bitboard_array_global[GenConst.BR].and(MoveConstants.SQUARE_BBS[GenConst.A8])))) + { + Board.castle_rights_global[BQS_CASTLE_RIGHTS] = false; + } + } + } + return captureIndex; + } + + static void unmakeMove(int piece, int tag, int startingSquare, int targetSquare, int captureIndex) + { + Pr.println("___unmake move____ piece: " + piece + " tag: " + tag + " startingSquare: " + startingSquare + " targetSquare: " + targetSquare + " captureIndex: " + captureIndex); + Board.is_white_global = !Board.is_white_global; + switch (tag) + { + case GenConst.TAG_NONE: //none + case GenConst.TAG_CHECK: //check + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + break; + case GenConst.TAG_CAPTURE: //capture + case GenConst.TAG_CHECK_CAPTURE: //check cap + assert captureIndex != -1 : "invalid capture index"; + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + Pr.println("bp capture before: " + Board.bitboard_array_global[GenConst.BP]); + Board.bitboard_array_global[captureIndex] = Board.bitboard_array_global[captureIndex].or(MoveConstants.SQUARE_BBS[targetSquare]); + Pr.println("bp capture after: " + Board.bitboard_array_global[GenConst.BP]); + break; + case GenConst.TAG_WHITEEP: //white ep + //move piece + Board.bitboard_array_global[GenConst.WP] =Board.bitboard_array_global[GenConst.WP].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.WP] =Board.bitboard_array_global[GenConst.WP].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + Board.bitboard_array_global[GenConst.BP] =Board.bitboard_array_global[GenConst.BP].and(MoveConstants.SQUARE_BBS[targetSquare + 8]); + break; + case GenConst.TAG_BLACKEP: //black ep + Board.bitboard_array_global[GenConst.BP] =Board.bitboard_array_global[GenConst.BP].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.BP] =Board.bitboard_array_global[GenConst.BP].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + Board.bitboard_array_global[GenConst.WP] =Board.bitboard_array_global[GenConst.WP].or(MoveConstants.SQUARE_BBS[targetSquare - 8]); + break; + + case GenConst.TAG_WCASTLEKS: //WKS + //white king + Board.bitboard_array_global[GenConst.WK] =Board.bitboard_array_global[GenConst.WK].or(MoveConstants.SQUARE_BBS[GenConst.E1]); + Board.bitboard_array_global[GenConst.WK] =Board.bitboard_array_global[GenConst.WK].and(MoveConstants.SQUARE_BBS[GenConst.G1].not()); + Board.bitboard_array_global[GenConst.WR] =Board.bitboard_array_global[GenConst.WR].or(MoveConstants.SQUARE_BBS[GenConst.H1]); + Board.bitboard_array_global[GenConst.WR] =Board.bitboard_array_global[GenConst.WR].and(MoveConstants.SQUARE_BBS[GenConst.F1].not()); + break; + case GenConst.TAG_WCASTLEQS: //WQS + Board.bitboard_array_global[GenConst.WK] =Board.bitboard_array_global[GenConst.WK].or(MoveConstants.SQUARE_BBS[GenConst.E1]); + Board.bitboard_array_global[GenConst.WK] =Board.bitboard_array_global[GenConst.WK].and(MoveConstants.SQUARE_BBS[GenConst.C1].not()); + Board.bitboard_array_global[GenConst.WR] =Board.bitboard_array_global[GenConst.WR].or(MoveConstants.SQUARE_BBS[GenConst.A1]); + Board.bitboard_array_global[GenConst.WR] =Board.bitboard_array_global[GenConst.WR].and(MoveConstants.SQUARE_BBS[GenConst.D1].not()); + break; + case GenConst.TAG_BCASTLEKS: //BKS + Board.bitboard_array_global[GenConst.BK] =Board.bitboard_array_global[GenConst.BK].or(MoveConstants.SQUARE_BBS[GenConst.E8]); + Board.bitboard_array_global[GenConst.BK] =Board.bitboard_array_global[GenConst.BK].and(MoveConstants.SQUARE_BBS[GenConst.G8].not()); + Board.bitboard_array_global[GenConst.BR] =Board.bitboard_array_global[GenConst.BR].or(MoveConstants.SQUARE_BBS[GenConst.H8]); + Board.bitboard_array_global[GenConst.BR] =Board.bitboard_array_global[GenConst.BR].and(MoveConstants.SQUARE_BBS[GenConst.F8].not()); + break; + case GenConst.TAG_BCASTLEQS: //BQS + Board.bitboard_array_global[GenConst.BK] =Board.bitboard_array_global[GenConst.BK].or(MoveConstants.SQUARE_BBS[GenConst.E8]); + Board.bitboard_array_global[GenConst.BK] =Board.bitboard_array_global[GenConst.BK].and(MoveConstants.SQUARE_BBS[GenConst.C8].not()); + Board.bitboard_array_global[GenConst.BR] =Board.bitboard_array_global[GenConst.BR].or(MoveConstants.SQUARE_BBS[GenConst.A8]); + Board.bitboard_array_global[GenConst.BR] =Board.bitboard_array_global[GenConst.BR].and(MoveConstants.SQUARE_BBS[GenConst.D8].not()); + break; + + case GenConst.TAG_BKnightPromotion: //BNPr + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.BN] =Board.bitboard_array_global[GenConst.BN].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + break; + case GenConst.TAG_BBishopPromotion: //BBPr + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.BB] =Board.bitboard_array_global[GenConst.BB].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + break; + case GenConst.TAG_BQueenPromotion: //BQPr + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.BQ] =Board.bitboard_array_global[GenConst.BQ].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + break; + case GenConst.TAG_BRookPromotion: //BRPr + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.BR] =Board.bitboard_array_global[GenConst.BR].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + break; + case 12: //WNPr + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.WN] =Board.bitboard_array_global[GenConst.WN].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + break; + case 13: //WBPr + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.WB] =Board.bitboard_array_global[GenConst.WB].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + break; + case 14: //WQPr + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.WQ] =Board.bitboard_array_global[GenConst.WQ].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + break; + case 15: //WRPr + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.WR] =Board.bitboard_array_global[GenConst.WR].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + break; + case 16: //BNPrCAP + assert captureIndex != -1 : "invalid capture index"; + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.BN] =Board.bitboard_array_global[GenConst.BN].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].or(MoveConstants.SQUARE_BBS[targetSquare]); + break; + case 17: //BBPrCAP + assert captureIndex != -1 : "invalid capture index"; + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.BB] =Board.bitboard_array_global[GenConst.BB].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].or(MoveConstants.SQUARE_BBS[targetSquare]); + break; + case 18: //BQPrCAP + assert captureIndex != -1 : "invalid capture index"; + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.BQ] =Board.bitboard_array_global[GenConst.BQ].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].or(MoveConstants.SQUARE_BBS[targetSquare]); + break; + case 19: //BRPrCAP + assert captureIndex != -1 : "invalid capture index"; + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.BR] =Board.bitboard_array_global[GenConst.BR].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].or(MoveConstants.SQUARE_BBS[targetSquare]); + break; + case 20: //WNPrCAP + assert captureIndex != -1 : "invalid capture index"; + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.WN] =Board.bitboard_array_global[GenConst.WN].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].or(MoveConstants.SQUARE_BBS[targetSquare]); + break; + case 21: //WBPrCAP + assert captureIndex != -1 : "invalid capture index"; + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.WB] =Board.bitboard_array_global[GenConst.WB].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].or(MoveConstants.SQUARE_BBS[targetSquare]); + break; + case 22: //WQPrCAP + assert captureIndex != -1 : "invalid capture index"; + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.WQ] =Board.bitboard_array_global[GenConst.WQ].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].or(MoveConstants.SQUARE_BBS[targetSquare]); + break; + case 23: //WRPrCAP + assert captureIndex != -1 : "invalid capture index"; + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.WR] =Board.bitboard_array_global[GenConst.WR].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].or(MoveConstants.SQUARE_BBS[targetSquare]); + break; + case 24: //WDouble + + Board.bitboard_array_global[GenConst.WP] =Board.bitboard_array_global[GenConst.WP].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.WP] =Board.bitboard_array_global[GenConst.WP].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + break; + case 25: //BDouble + Board.bitboard_array_global[GenConst.BP] =Board.bitboard_array_global[GenConst.BP].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[GenConst.BP] =Board.bitboard_array_global[GenConst.BP].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + break; + } + + + } + + static int getMoves(int[][] move_list) + { + Pr.println(" getMoves:"); + + int move_count = 0; + + //#region Moves + + //Move generating variables + BigInteger WHITE_OCCUPANCIES = Board.bitboard_array_global[0] + .or(Board.bitboard_array_global[1]) + .or(Board.bitboard_array_global[2]) + .or(Board.bitboard_array_global[3]) + .or(Board.bitboard_array_global[4]) + .or(Board.bitboard_array_global[5]); + BigInteger BLACK_OCCUPANCIES = Board.bitboard_array_global[6] + .or(Board.bitboard_array_global[7]) + .or(Board.bitboard_array_global[8]) + .or(Board.bitboard_array_global[9]) + .or(Board.bitboard_array_global[10]) + .or(Board.bitboard_array_global[11]); + BigInteger COMBINED_OCCUPANCIES = WHITE_OCCUPANCIES.or(BLACK_OCCUPANCIES); + BigInteger EMPTY_OCCUPANCIES = COMBINED_OCCUPANCIES.not(); + BigInteger temp_bitboard, temp_pin_bitboard, temp_attack, temp_empty, temp_captures; + BigInteger check_bitboard = new BigInteger("0"); + int starting_square = NO_SQUARE, target_square = NO_SQUARE; + + int[][] pinArray = + { + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + }; + + int pinNumber = 0; + + Pr.println(" -variables declared"); + + if (Board.is_white_global == true) + { + Pr.println(" white to play"); + + int whiteKingCheckCount = 0; + int whiteKingPosition = BitScanForward(Board.bitboard_array_global[GenConst.WK]); + + Pr.print(" white king position: "); + Pr.printSquareLn(whiteKingPosition); + + //#region White checks and pins + + //pawns + temp_bitboard = Board.bitboard_array_global[GenConst.BP].and(MoveConstants.WHITE_PAWN_ATTACKS[whiteKingPosition]); + if (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + int pawn_square = BitScanForward(temp_bitboard); + + if (check_bitboard.compareTo(BigInteger.ZERO) != 0) + { + check_bitboard = MoveConstants.SQUARE_BBS[pawn_square]; + } + + whiteKingCheckCount++; + } + + //knights + temp_bitboard = Board.bitboard_array_global[GenConst.BN].and(MoveConstants.KNIGHT_ATTACKS[whiteKingPosition]); + if (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + int knight_square = BitScanForward(temp_bitboard); + + if (check_bitboard.compareTo(BigInteger.ZERO) != 0) + { + check_bitboard = MoveConstants.SQUARE_BBS[knight_square]; + } + + whiteKingCheckCount++; + } + + //bishops + BigInteger bishopAttacksChecks = MoveUtils.GetBishopMovesSeparate(BLACK_OCCUPANCIES, whiteKingPosition); + temp_bitboard = Board.bitboard_array_global[GenConst.BB].and(bishopAttacksChecks); + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + int piece_square = BitScanForward(temp_bitboard); + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[whiteKingPosition][piece_square].and(WHITE_OCCUPANCIES); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + if (check_bitboard.compareTo(BigInteger.ZERO) != 0) + { + check_bitboard = Inb.INBETWEEN_BITBOARDS[whiteKingPosition][piece_square]; + } + whiteKingCheckCount++; + } + else + { + int pinned_square = BitScanForward(temp_pin_bitboard); + temp_pin_bitboard = temp_pin_bitboard.and(temp_pin_bitboard.subtract(BigInteger.ONE)); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + pinArray[pinNumber][PINNED_SQUARE_INDEX] = pinned_square; + pinArray[pinNumber][PINNING_PIECE_INDEX] = piece_square; + pinNumber++; + } + } + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + } + + //queen + temp_bitboard = Board.bitboard_array_global[GenConst.BQ].and(bishopAttacksChecks); + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + int piece_square = BitScanForward(temp_bitboard); + + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[whiteKingPosition][piece_square].and(WHITE_OCCUPANCIES); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + if (check_bitboard.compareTo(BigInteger.ZERO) != 0) + { + check_bitboard = Inb.INBETWEEN_BITBOARDS[whiteKingPosition][piece_square]; + } + whiteKingCheckCount++; + } + else + { + int pinned_square = BitScanForward(temp_pin_bitboard); + temp_pin_bitboard = temp_pin_bitboard.and(temp_pin_bitboard.subtract(BigInteger.ONE)); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + pinArray[pinNumber][PINNED_SQUARE_INDEX] = pinned_square; + pinArray[pinNumber][PINNING_PIECE_INDEX] = piece_square; + pinNumber++; + } + } + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + } + + //rook + BigInteger rook_attacks = MoveUtils.GetRookMovesSeparate(BLACK_OCCUPANCIES, whiteKingPosition); + temp_bitboard = Board.bitboard_array_global[GenConst.BR].and(rook_attacks); + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + int piece_square = BitScanForward(temp_bitboard); + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[whiteKingPosition][piece_square].and(WHITE_OCCUPANCIES); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + if (check_bitboard.compareTo(BigInteger.ZERO) != 0) + { + check_bitboard = Inb.INBETWEEN_BITBOARDS[whiteKingPosition][piece_square]; + } + whiteKingCheckCount++; + } + else + { + int pinned_square = BitScanForward(temp_pin_bitboard); + temp_pin_bitboard = temp_pin_bitboard.and(temp_pin_bitboard.subtract(BigInteger.ONE)); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + pinArray[pinNumber][PINNED_SQUARE_INDEX] = pinned_square; + pinArray[pinNumber][PINNING_PIECE_INDEX] = piece_square; + pinNumber++; + } + } + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + } + + //queen + temp_bitboard = Board.bitboard_array_global[GenConst.BQ].and(rook_attacks); + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + int piece_square = BitScanForward(temp_bitboard); + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[whiteKingPosition][piece_square].and(WHITE_OCCUPANCIES); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + if (check_bitboard.compareTo(BigInteger.ZERO) != 0) + { + check_bitboard = Inb.INBETWEEN_BITBOARDS[whiteKingPosition][piece_square]; + } + whiteKingCheckCount++; + } + else + { + int pinned_square = BitScanForward(temp_pin_bitboard); + temp_pin_bitboard = temp_pin_bitboard.and(temp_pin_bitboard.subtract(BigInteger.ONE)); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + pinArray[pinNumber][PINNED_SQUARE_INDEX] = pinned_square; + pinArray[pinNumber][PINNING_PIECE_INDEX] = piece_square; + pinNumber++; + } + } + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + } + + Pr.println(" -pins and checks complete: "); + Pr.print(" white king check count: "); + Pr.printIntLn(whiteKingCheckCount); + Pr.print(" pin count: "); + Pr.printIntLn(pinNumber); + Pr.println(" _____________"); + + //#endregion + + BigInteger occupanciesWithoutWhiteKing = COMBINED_OCCUPANCIES.and(Board.bitboard_array_global[GenConst.WK].not()); + int wKingMoveCount = 0; + + + temp_attack = MoveConstants.KING_ATTACKS[whiteKingPosition]; + temp_empty = temp_attack.and(EMPTY_OCCUPANCIES); + while (temp_empty.signum() != 0) // Using BigInteger's signum() to check if it's not 0 + { + target_square = BitScanForward(temp_empty); + temp_empty = temp_empty.and(temp_empty.subtract(BigInteger.ONE)); // Using BigInteger's subtract and and + + if (Board.bitboard_array_global[GenConst.BP].and(MoveConstants.WHITE_PAWN_ATTACKS[target_square]).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.BN].and(MoveConstants.KNIGHT_ATTACKS[target_square]).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.BK].and(MoveConstants.KING_ATTACKS[target_square]).signum() != 0) { + continue; + } + BigInteger bishopAttacks = MoveUtils.GetBishopMovesSeparate(occupanciesWithoutWhiteKing, target_square); + if (Board.bitboard_array_global[GenConst.BB].and(bishopAttacks).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.BQ].and(bishopAttacks).signum() != 0) { + continue; + } + BigInteger rookAttacks = MoveUtils.GetRookMovesSeparate(occupanciesWithoutWhiteKing, target_square); + if (Board.bitboard_array_global[GenConst.BR].and(rookAttacks).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.BQ].and(rookAttacks).signum() != 0) { + continue; + } + + move_list[move_count][MOVE_STARTING] = whiteKingPosition; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_NONE; + move_list[move_count][MOVE_PIECE] = GenConst.WK; + move_count++; + wKingMoveCount++; + } + + //captures + temp_captures = temp_attack.and(BLACK_OCCUPANCIES); + while (temp_captures.signum() != 0) // Using BigInteger's signum() to check if it's not 0 + { + target_square = BitScanForward(temp_captures); + temp_captures = temp_captures.and(temp_captures.subtract(BigInteger.ONE)); // Using BigInteger's subtract and and + + if (Board.bitboard_array_global[GenConst.BP].and(MoveConstants.WHITE_PAWN_ATTACKS[target_square]).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.BN].and(MoveConstants.KNIGHT_ATTACKS[target_square]).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.BK].and(MoveConstants.KING_ATTACKS[target_square]).signum() != 0) { + continue; + } + BigInteger bishopAttacks = MoveUtils.GetBishopMovesSeparate(occupanciesWithoutWhiteKing, target_square); + if (Board.bitboard_array_global[GenConst.BB].and(bishopAttacks).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.BQ].and(bishopAttacks).signum() != 0) { + continue; + } + BigInteger rookAttacks = MoveUtils.GetRookMovesSeparate(occupanciesWithoutWhiteKing, target_square); + if (Board.bitboard_array_global[GenConst.BR].and(rookAttacks).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.BQ].and(rookAttacks).signum() != 0) { + continue; + } + + move_list[move_count][MOVE_STARTING] = whiteKingPosition; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_CAPTURE; + move_list[move_count][MOVE_PIECE] = GenConst.WK; + move_count++; + wKingMoveCount++; + } + + Pr.print(" white king move count: "); + Pr.printIntLn(wKingMoveCount); + Pr.println(" _____________"); + + if (whiteKingCheckCount < 2) + { + + if (whiteKingCheckCount == 0) + { + check_bitboard = MAX_ULONG; + } + + //#region White castling + + if (whiteKingCheckCount == 0) + { + if (Board.castle_rights_global[WKS_CASTLE_RIGHTS] == true) + { + if (whiteKingPosition == GenConst.E1) //king on e1 + { + if (isNotZero(WKS_EMPTY_BITBOARD.and(COMBINED_OCCUPANCIES)) == false) //f1 and g1 empty + { + if (isNotZero(Board.bitboard_array_global[GenConst.WR].and(MoveConstants.SQUARE_BBS[GenConst.H1])) == false) //rook on h1 + { + if (MoveUtils.Is_Square_Attacked_By_Black_Global(GenConst.F1, COMBINED_OCCUPANCIES) == false) + { + if (MoveUtils.Is_Square_Attacked_By_Black_Global(GenConst.G1, COMBINED_OCCUPANCIES) == false) + { + move_list[move_count][MOVE_STARTING] = GenConst.E1; + move_list[move_count][MOVE_TARGET] = GenConst.G1; + move_list[move_count][MOVE_TAG] = GenConst.TAG_WCASTLEKS; + move_list[move_count][MOVE_PIECE] = GenConst.WK; + move_count++; + } + } + } + } + } + } + if (Board.castle_rights_global[WQS_CASTLE_RIGHTS] == true) + { + if (whiteKingPosition == GenConst.E1) //king on e1 + { + if (isNotZero(WQS_EMPTY_BITBOARD.and(COMBINED_OCCUPANCIES)) == false) //f1 and g1 empty + { + if ((isNotZero(Board.bitboard_array_global[GenConst.WR].and(MoveConstants.SQUARE_BBS[GenConst.A1]))) == true) //rook on h1 + { + if (MoveUtils.Is_Square_Attacked_By_Black_Global(GenConst.C1, COMBINED_OCCUPANCIES) == false) + { + if (MoveUtils.Is_Square_Attacked_By_Black_Global(GenConst.D1, COMBINED_OCCUPANCIES) == false) + { + move_list[move_count][MOVE_STARTING] = GenConst.E1; + move_list[move_count][MOVE_TARGET] = GenConst.C1; + move_list[move_count][MOVE_TAG] = GenConst.TAG_WCASTLEQS; + move_list[move_count][MOVE_PIECE] = GenConst.WK; + move_count++; + } + } + } + } + } + } + } + + //#endregion + + //#region White knight moves + + Pr.println(" -white knight moves: "); + temp_bitboard = Board.bitboard_array_global[GenConst.WN]; + Pr.print(" white knight bitboard: "); + Pr.printBigIntegerLn(temp_bitboard); + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + starting_square = BitScanForward(temp_bitboard); + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); //removes the knight from that square to not infinitely loop + + Pr.println("\n knight on square: " + starting_square); + + temp_pin_bitboard = MAX_ULONG; + if (pinNumber != 0) + { + for (int i = 0; i < pinNumber; i++) + { + if (pinArray[i][PINNED_SQUARE_INDEX] == starting_square) + { + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[whiteKingPosition][pinArray[i][PINNING_PIECE_INDEX]]; + } + } + } + + temp_attack = ((MoveConstants.KNIGHT_ATTACKS[starting_square].and(BLACK_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); //gets knight captures + Pr.println(" knight captures: " + temp_attack); + + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_CAPTURE; + move_list[move_count][MOVE_PIECE] = GenConst.WN; + move_count++; + } + + temp_attack = ((MoveConstants.KNIGHT_ATTACKS[starting_square].and(EMPTY_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + Pr.println(" knight regular moves: " + temp_attack); + + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_NONE; + move_list[move_count][MOVE_PIECE] = GenConst.WN; + move_count++; + } + } + + //#endregion + + //#region White pawn moves + Pr.println(" _____________"); + Pr.println(" movecount: " + move_count); + temp_bitboard = Board.bitboard_array_global[GenConst.WP]; + Pr.println(" -white pawn moves: "); + + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + starting_square = BitScanForward(temp_bitboard); + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + + Pr.println("\n pawn on square: " + starting_square); + + temp_pin_bitboard = MAX_ULONG; + if (pinNumber != 0) + { + for (int i = 0; i < pinNumber; i++) + { + if (pinArray[i][PINNED_SQUARE_INDEX] == starting_square) + { + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[whiteKingPosition][pinArray[i][PINNING_PIECE_INDEX]]; + } + } + } + + //#region pawn forward + + if (isZero(MoveConstants.SQUARE_BBS[starting_square - 8].and(COMBINED_OCCUPANCIES)) == true) //if up one square is empty + { + if (isNotZero(MoveConstants.SQUARE_BBS[starting_square - 8].and(check_bitboard).and(temp_pin_bitboard)) == true) //if not pinned or check + { + if (isNotZero(MoveConstants.SQUARE_BBS[starting_square].and(RANK_7_BITBOARD))) //if promotion + { + Pr.println(" pawn promotion forward!"); + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = starting_square - 8; + move_list[move_count][MOVE_TAG] = GenConst.TAG_WQueenPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = starting_square - 8; + move_list[move_count][MOVE_TAG] = GenConst.TAG_WRookPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = starting_square - 8; + move_list[move_count][MOVE_TAG] = GenConst.TAG_WBishopPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = starting_square - 8; + move_list[move_count][MOVE_TAG] = GenConst.TAG_WBishopPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + + } + else + { + Pr.println(" pawn forward one"); + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = starting_square - 8; + move_list[move_count][MOVE_TAG] = GenConst.TAG_NONE; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + } + } + + if ((isNotZero(MoveConstants.SQUARE_BBS[starting_square].and(RANK_2_BITBOARD))) == true) //if on rank 2 + { + if (isNotZero(MoveConstants.SQUARE_BBS[starting_square - 16].and(check_bitboard).and(temp_pin_bitboard)) == true) //if not pinned or + { + if (isZero(MoveConstants.SQUARE_BBS[starting_square - 16].and(COMBINED_OCCUPANCIES)) == true) //if up two squares and one square are empty + { + Pr.println(" pawn forward two"); + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = starting_square - 16; + move_list[move_count][MOVE_TAG] = GenConst.TAG_DoublePawnWhite; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + } + } + } + } + + //#endregion + //#region pawn attacks + + temp_attack = ((MoveConstants.WHITE_PAWN_ATTACKS[starting_square].and(BLACK_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); //if black piece diagonal to pawn + Pr.println(" pawn attacks: " + temp_attack); + + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + if (isNotZero(MoveConstants.SQUARE_BBS[starting_square].and(RANK_7_BITBOARD)) == true) //if promotion + { + Pr.println(" pawn promotion attack!"); + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_WCaptureQueenPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_WCaptureRookPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_WCaptureBishopPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_WCaptureKnightPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + } + else + { + Pr.println(" add pawn attack move " + starting_square + " to " + target_square); + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_CAPTURE; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + } + } + + if (isNotZero(MoveConstants.SQUARE_BBS[starting_square].and(RANK_5_BITBOARD))) + { // check rank for ep + if (Board.ep != NO_SQUARE) + { + if (isNotZero(MoveConstants.WHITE_PAWN_ATTACKS[starting_square] + .and(MoveConstants.SQUARE_BBS[Board.ep]) + .and(check_bitboard) + .and(temp_pin_bitboard))) { + if (isZero(Board.bitboard_array_global[GenConst.WK].and(RANK_5_BITBOARD))) { // if no king on rank 5 + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = Board.ep; + move_list[move_count][MOVE_TAG] = GenConst.TAG_WHITEEP; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + } else if (isZero(Board.bitboard_array_global[GenConst.BR].and(RANK_5_BITBOARD)) && + isZero(Board.bitboard_array_global[GenConst.BQ].and(RANK_5_BITBOARD))) { // if no b rook or queen on rank 5 + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = Board.ep; + move_list[move_count][MOVE_TAG] = GenConst.TAG_WHITEEP; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + } else { // wk and br or bq on rank 5 + BigInteger occupancyWithoutEPPawns = COMBINED_OCCUPANCIES.and(MoveConstants.SQUARE_BBS[starting_square].not()); + occupancyWithoutEPPawns = occupancyWithoutEPPawns.and(MoveConstants.SQUARE_BBS[Board.ep + 8].not()); + + BigInteger rookAttacksFromKing = MoveUtils.GetRookMovesSeparate(occupancyWithoutEPPawns, whiteKingPosition); + + if (isZero(rookAttacksFromKing.and(Board.bitboard_array_global[GenConst.BR]))) + { + if (isZero(rookAttacksFromKing.and(Board.bitboard_array_global[GenConst.BQ]))) + { + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = Board.ep; + move_list[move_count][MOVE_TAG] = GenConst.TAG_WHITEEP; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + } + } + } + } + } + } + + //#endregion + } + + //#endregion + + Pr.println(" -after pawns"); + + //#region White rook moves + + temp_bitboard = Board.bitboard_array_global[GenConst.WR]; + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + starting_square = BitScanForward(temp_bitboard); + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + + temp_pin_bitboard = MAX_ULONG; + if (pinNumber != 0) + { + for (int i = 0; i < pinNumber; i++) + { + if (pinArray[i][PINNED_SQUARE_INDEX] == starting_square) + { + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[whiteKingPosition][pinArray[i][PINNING_PIECE_INDEX]]; + } + } + } + + BigInteger rookAttacks = MoveUtils.GetRookMovesSeparate(COMBINED_OCCUPANCIES, starting_square); + + temp_attack = ((rookAttacks.and(BLACK_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_CAPTURE; + move_list[move_count][MOVE_PIECE] = GenConst.WR; + move_count++; + } + + temp_attack = ((rookAttacks.and(EMPTY_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_NONE; + move_list[move_count][MOVE_PIECE] = GenConst.WR; + move_count++; + } + } + + //#endregion + + Pr.println(" -after rooks"); + + //#region White bishop moves + + //Pr.println("\nwhite bishop"); + temp_bitboard = Board.bitboard_array_global[GenConst.WB]; + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + starting_square = BitScanForward(temp_bitboard); + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + + temp_pin_bitboard = MAX_ULONG; + if (pinNumber != 0) + { + for (int i = 0; i < pinNumber; i++) + { + if (pinArray[i][PINNED_SQUARE_INDEX] == starting_square) + { + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[whiteKingPosition][pinArray[i][PINNING_PIECE_INDEX]]; + } + } + } + + //Pr.println("get bishop attacks"); + BigInteger bishopAttacks = MoveUtils.GetBishopMovesSeparate(COMBINED_OCCUPANCIES, starting_square); + //Pr.println("bishop attacks"); + //Pr.printBigIntegerLn(bishopAttacks); + + temp_attack = ((bishopAttacks.and(BLACK_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_CAPTURE; + move_list[move_count][MOVE_PIECE] = GenConst.WB; + move_count++; + } + + temp_attack = ((bishopAttacks.and(EMPTY_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_NONE; + move_list[move_count][MOVE_PIECE] = GenConst.WB; + move_count++; + } + } + + //#endregion + + Pr.println(" -after bishop"); + + //#region White queen moves + + Pr.println("______________"); + Pr.println(" white queen:"); + temp_bitboard = Board.bitboard_array_global[GenConst.WQ]; + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + starting_square = BitScanForward(temp_bitboard); + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + + Pr.println("\n queen on square: " + starting_square); + + temp_pin_bitboard = MAX_ULONG; + if (pinNumber != 0) + { + for (int i = 0; i < pinNumber; i++) + { + if (pinArray[i][PINNED_SQUARE_INDEX] == starting_square) + { + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[whiteKingPosition][pinArray[i][PINNING_PIECE_INDEX]]; + } + } + } + + BigInteger queenAttacks = MoveUtils.GetRookMovesSeparate(COMBINED_OCCUPANCIES, starting_square); + Pr.println("\n queen attacks rook: " + queenAttacks); + queenAttacks = queenAttacks.or(MoveUtils.GetBishopMovesSeparate(COMBINED_OCCUPANCIES, starting_square)); + Pr.println("\n queen attacks combined: " + queenAttacks); + + temp_attack = ((queenAttacks.and(BLACK_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + Pr.println("\n queen attacks captures: " + temp_attack); + + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_CAPTURE; + move_list[move_count][MOVE_PIECE] = GenConst.WQ; + move_count++; + Pr.println(" add queen attack capture " + starting_square + " to " + target_square); + } + + temp_attack = ((queenAttacks.and(EMPTY_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + Pr.println("\n queen regular moves: " + temp_attack); + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_NONE; + move_list[move_count][MOVE_PIECE] = GenConst.WQ; + move_count++; + Pr.println(" add queen move " + starting_square + " to " + target_square); + } + } + + //#endregion + + Pr.println(" -after queen"); + } + } + else //black move + { + int blackKingCheckCount = 0; + int blackKingPosition = BitScanForward(Board.bitboard_array_global[GenConst.BK]); + + // Pr.print(" black king position: "); + // Pr.printIntLn(blackKingPosition); + + //#region black checks and pins + + //pawns + temp_bitboard = Board.bitboard_array_global[GenConst.WP].and(MoveConstants.BLACK_PAWN_ATTACKS[blackKingPosition]); + if (temp_bitboard.compareTo(BigInteger.ZERO) != 0) //if there is pawn attacking king + { + int pawn_square = BitScanForward(temp_bitboard); + + if (check_bitboard.compareTo(BigInteger.ZERO) != 0) + { + check_bitboard = MoveConstants.SQUARE_BBS[pawn_square]; + } + + blackKingCheckCount++; + } + + //knights + temp_bitboard = Board.bitboard_array_global[GenConst.WN].and(MoveConstants.KNIGHT_ATTACKS[blackKingPosition]); + if (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + int knight_square = BitScanForward(temp_bitboard); + + if (check_bitboard.compareTo(BigInteger.ZERO) != 0) + { + check_bitboard = MoveConstants.SQUARE_BBS[knight_square]; + } + + blackKingCheckCount++; + } + + //bishops + BigInteger bishopAttacksChecks = MoveUtils.GetBishopMovesSeparate(WHITE_OCCUPANCIES, blackKingPosition); + temp_bitboard = Board.bitboard_array_global[GenConst.WB].and(bishopAttacksChecks); + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + int piece_square = BitScanForward(temp_bitboard); + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[blackKingPosition][piece_square].and(BLACK_OCCUPANCIES); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + if (check_bitboard.compareTo(BigInteger.ZERO) != 0) + { + check_bitboard = Inb.INBETWEEN_BITBOARDS[blackKingPosition][piece_square]; + } + blackKingCheckCount++; + } + else + { + int pinned_square = BitScanForward(temp_pin_bitboard); + temp_pin_bitboard = temp_pin_bitboard.and(temp_pin_bitboard.subtract(BigInteger.ONE)); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + pinArray[pinNumber][PINNED_SQUARE_INDEX] = pinned_square; + pinArray[pinNumber][PINNING_PIECE_INDEX] = piece_square; + pinNumber++; + } + } + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + } + + //queen + temp_bitboard = Board.bitboard_array_global[GenConst.WQ].and(bishopAttacksChecks); + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + int piece_square = BitScanForward(temp_bitboard); + + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[blackKingPosition][piece_square].and(BLACK_OCCUPANCIES); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + if (check_bitboard.compareTo(BigInteger.ZERO) != 0) + { + check_bitboard = Inb.INBETWEEN_BITBOARDS[blackKingPosition][piece_square]; + } + blackKingCheckCount++; + } + else + { + int pinned_square = BitScanForward(temp_pin_bitboard); + temp_pin_bitboard = temp_pin_bitboard.and(temp_pin_bitboard.subtract(BigInteger.ONE)); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + pinArray[pinNumber][PINNED_SQUARE_INDEX] = pinned_square; + pinArray[pinNumber][PINNING_PIECE_INDEX] = piece_square; + pinNumber++; + } + } + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + } + + //rook + BigInteger rook_attacks = MoveUtils.GetRookMovesSeparate(WHITE_OCCUPANCIES, blackKingPosition); + temp_bitboard = Board.bitboard_array_global[GenConst.WR].and(rook_attacks); + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + int piece_square = BitScanForward(temp_bitboard); + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[blackKingPosition][piece_square].and(BLACK_OCCUPANCIES); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + if (check_bitboard.compareTo(BigInteger.ZERO) != 0) + { + check_bitboard = Inb.INBETWEEN_BITBOARDS[blackKingPosition][piece_square]; + } + blackKingCheckCount++; + } + else + { + int pinned_square = BitScanForward(temp_pin_bitboard); + temp_pin_bitboard = temp_pin_bitboard.and(temp_pin_bitboard.subtract(BigInteger.ONE)); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + pinArray[pinNumber][PINNED_SQUARE_INDEX] = pinned_square; + pinArray[pinNumber][PINNING_PIECE_INDEX] = piece_square; + pinNumber++; + } + } + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + } + + //queen + temp_bitboard = Board.bitboard_array_global[GenConst.WQ].and(rook_attacks); + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + int piece_square = BitScanForward(temp_bitboard); + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[blackKingPosition][piece_square].and(WHITE_OCCUPANCIES); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + if (check_bitboard.compareTo(BigInteger.ZERO) != 0) + { + check_bitboard = Inb.INBETWEEN_BITBOARDS[blackKingPosition][piece_square]; + } + blackKingCheckCount++; + } + else + { + int pinned_square = BitScanForward(temp_pin_bitboard); + temp_pin_bitboard = temp_pin_bitboard.and(temp_pin_bitboard.subtract(BigInteger.ONE)); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + pinArray[pinNumber][PINNED_SQUARE_INDEX] = pinned_square; + pinArray[pinNumber][PINNING_PIECE_INDEX] = piece_square; + pinNumber++; + } + } + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + } + + //#endregion + + BigInteger occupanciesWithoutWhiteKing = COMBINED_OCCUPANCIES.and(Board.bitboard_array_global[GenConst.WK].not()); + + temp_attack = MoveConstants.KING_ATTACKS[blackKingPosition]; + temp_empty = temp_attack.and(EMPTY_OCCUPANCIES); + + while (temp_empty.signum() != 0) // Using BigInteger's signum() to check if it's not 0 + { + target_square = BitScanForward(temp_empty); + temp_empty = temp_empty.and(temp_empty.subtract(BigInteger.ONE)); // Using BigInteger's subtract and and + + if (Board.bitboard_array_global[GenConst.WP].and(MoveConstants.BLACK_PAWN_ATTACKS[target_square]).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.WN].and(MoveConstants.KNIGHT_ATTACKS[target_square]).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.WK].and(MoveConstants.KING_ATTACKS[target_square]).signum() != 0) { + continue; + } + BigInteger bishopAttacks = MoveUtils.GetBishopMovesSeparate(occupanciesWithoutWhiteKing, target_square); + if (Board.bitboard_array_global[GenConst.WB].and(bishopAttacks).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.WQ].and(bishopAttacks).signum() != 0) { + continue; + } + BigInteger rookAttacks = MoveUtils.GetRookMovesSeparate(occupanciesWithoutWhiteKing, target_square); + if (Board.bitboard_array_global[GenConst.WR].and(rookAttacks).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.WQ].and(rookAttacks).signum() != 0) { + continue; + } + + move_list[move_count][MOVE_STARTING] = blackKingPosition; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_NONE; + move_list[move_count][MOVE_PIECE] = GenConst.BK; + move_count++; + } + + //captures + temp_captures = temp_attack.and(WHITE_OCCUPANCIES); + + while (temp_captures.signum() != 0) // Using BigInteger's signum() to check if it's not 0 + { + target_square = BitScanForward(temp_captures); + temp_captures = temp_captures.and(temp_captures.subtract(BigInteger.ONE)); // Using BigInteger's subtract and and + + if (Board.bitboard_array_global[GenConst.WP].and(MoveConstants.BLACK_PAWN_ATTACKS[target_square]).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.WN].and(MoveConstants.KNIGHT_ATTACKS[target_square]).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.WK].and(MoveConstants.KING_ATTACKS[target_square]).signum() != 0) { + continue; + } + BigInteger bishopAttacks = MoveUtils.GetBishopMovesSeparate(occupanciesWithoutWhiteKing, target_square); + if (Board.bitboard_array_global[GenConst.WB].and(bishopAttacks).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.WQ].and(bishopAttacks).signum() != 0) { + continue; + } + BigInteger rookAttacks = MoveUtils.GetRookMovesSeparate(occupanciesWithoutWhiteKing, target_square); + if (Board.bitboard_array_global[GenConst.WR].and(rookAttacks).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.WQ].and(rookAttacks).signum() != 0) { + continue; + } + + move_list[move_count][MOVE_STARTING] = blackKingPosition; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_CAPTURE; + move_list[move_count][MOVE_PIECE] = GenConst.BK; + move_count++; + } + + if (blackKingCheckCount < 2) + { + + if (blackKingCheckCount == 0) + { + check_bitboard = MAX_ULONG; + } + + //#region Black castling + + if (blackKingCheckCount == 0) + { + if (Board.castle_rights_global[BKS_CASTLE_RIGHTS] == true) + { + if (blackKingPosition == GenConst.E8) //king on e1 + { + if (isNotZero(BKS_EMPTY_BITBOARD.and(COMBINED_OCCUPANCIES)) == false) //f1 and g1 empty + { + if (isNotZero(Board.bitboard_array_global[GenConst.BR].and(MoveConstants.SQUARE_BBS[GenConst.H8])) == false) //rook on h8 + { + if (MoveUtils.Is_Square_Attacked_By_White_Global(GenConst.F8, COMBINED_OCCUPANCIES) == false) + { + if (MoveUtils.Is_Square_Attacked_By_White_Global(GenConst.G8, COMBINED_OCCUPANCIES) == false) + { + move_list[move_count][MOVE_STARTING] = GenConst.E8; + move_list[move_count][MOVE_TARGET] = GenConst.G8; + move_list[move_count][MOVE_TAG] = GenConst.TAG_BCASTLEKS; + move_list[move_count][MOVE_PIECE] = GenConst.BK; + move_count++; + } + } + } + } + } + } + if (Board.castle_rights_global[BQS_CASTLE_RIGHTS] == true) + { + if (blackKingPosition == GenConst.E8) //king on e1 + { + if (isNotZero(BQS_EMPTY_BITBOARD.and(COMBINED_OCCUPANCIES)) == false) //f1 and g1 empty + { + if ((isNotZero(Board.bitboard_array_global[GenConst.BR].and(MoveConstants.SQUARE_BBS[GenConst.A8]))) == true) //rook on h1 + { + if (MoveUtils.Is_Square_Attacked_By_White_Global(GenConst.C8, COMBINED_OCCUPANCIES) == false) + { + if (MoveUtils.Is_Square_Attacked_By_White_Global(GenConst.D8, COMBINED_OCCUPANCIES) == false) + { + move_list[move_count][MOVE_STARTING] = GenConst.E8; + move_list[move_count][MOVE_TARGET] = GenConst.C8; + move_list[move_count][MOVE_TAG] = GenConst.TAG_BCASTLEQS; + move_list[move_count][MOVE_PIECE] = GenConst.BK; + move_count++; + } + } + } + } + } + } + } + + //#endregion + + //#region Black knight moves + + temp_bitboard = Board.bitboard_array_global[GenConst.BN]; + + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + starting_square = BitScanForward(temp_bitboard); + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); //removes the knight from that square to not infinitely loop + + temp_pin_bitboard = MAX_ULONG; + if (pinNumber != 0) + { + for (int i = 0; i < pinNumber; i++) + { + if (pinArray[i][PINNED_SQUARE_INDEX] == starting_square) + { + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[blackKingPosition][pinArray[i][PINNING_PIECE_INDEX]]; + } + } + } + + temp_attack = ((MoveConstants.KNIGHT_ATTACKS[starting_square].and(WHITE_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); //gets knight captures + + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_CAPTURE; + move_list[move_count][MOVE_PIECE] = GenConst.BN; + move_count++; + } + + temp_attack = ((MoveConstants.KNIGHT_ATTACKS[starting_square].and(EMPTY_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_NONE; + move_list[move_count][MOVE_PIECE] = GenConst.BN; + move_count++; + } + } + + //#endregion + + //#region Black pawn moves + + temp_bitboard = Board.bitboard_array_global[GenConst.BP]; + + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + starting_square = BitScanForward(temp_bitboard); + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + + temp_pin_bitboard = MAX_ULONG; + if (pinNumber != 0) + { + for (int i = 0; i < pinNumber; i++) + { + if (pinArray[i][PINNED_SQUARE_INDEX] == starting_square) + { + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[blackKingPosition][pinArray[i][PINNING_PIECE_INDEX]]; + } + } + } + + //#region pawn forward + + if (isZero(MoveConstants.SQUARE_BBS[starting_square + 8].and(COMBINED_OCCUPANCIES)) == true) //if up one square is empty + { + if (isNotZero(MoveConstants.SQUARE_BBS[starting_square + 8].and(check_bitboard).and(temp_pin_bitboard)) == true) //if not pinned or check + { + if (isNotZero(MoveConstants.SQUARE_BBS[starting_square].and(RANK_2_BITBOARD))) //if promotion + { + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = starting_square + 8; + move_list[move_count][MOVE_TAG] = GenConst.TAG_BQueenPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = starting_square + 8; + move_list[move_count][MOVE_TAG] = GenConst.TAG_BRookPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = starting_square + 8; + move_list[move_count][MOVE_TAG] = GenConst.TAG_BBishopPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = starting_square + 8; + move_list[move_count][MOVE_TAG] = GenConst.TAG_BBishopPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + + } + else + { + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = starting_square + 8; + move_list[move_count][MOVE_TAG] = GenConst.TAG_NONE; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + } + } + + if ((isNotZero(MoveConstants.SQUARE_BBS[starting_square].and(RANK_7_BITBOARD))) == true) //if on rank 7 + { + if (isNotZero(MoveConstants.SQUARE_BBS[starting_square + 16].and(check_bitboard).and(temp_pin_bitboard)) == true) //if not pinned or + { + if (isZero(MoveConstants.SQUARE_BBS[starting_square + 16].and(COMBINED_OCCUPANCIES)) == true) //if up two squares and one square are empty + { + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = starting_square + 16; + move_list[move_count][MOVE_TAG] = GenConst.TAG_DoublePawnBlack; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + } + } + } + } + + //#endregion + //#region pawn attacks + + temp_attack = ((MoveConstants.BLACK_PAWN_ATTACKS[starting_square].and(WHITE_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); //if black piece diagonal to pawn + + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + if (isNotZero(MoveConstants.SQUARE_BBS[starting_square].and(RANK_2_BITBOARD)) == true) //if promotion + { + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_BCaptureQueenPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_BCaptureRookPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_BCaptureBishopPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_BCaptureKnightPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + } + else + { + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_CAPTURE; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + } + } + + if (isNotZero(MoveConstants.SQUARE_BBS[starting_square].and(RANK_4_BITBOARD))) + { // check rank for ep + if (Board.ep != NO_SQUARE) + { + if (isNotZero(MoveConstants.BLACK_PAWN_ATTACKS[starting_square] + .and(MoveConstants.SQUARE_BBS[Board.ep]) + .and(check_bitboard) + .and(temp_pin_bitboard))) { + if (isZero(Board.bitboard_array_global[GenConst.WK].and(RANK_4_BITBOARD))) { // if no king on rank 5 + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = Board.ep; + move_list[move_count][MOVE_TAG] = GenConst.TAG_BLACKEP; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + } else if (isZero(Board.bitboard_array_global[GenConst.WR].and(RANK_4_BITBOARD)) && + isZero(Board.bitboard_array_global[GenConst.WQ].and(RANK_4_BITBOARD))) { // if no b rook or queen on rank 5 + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = Board.ep; + move_list[move_count][MOVE_TAG] = GenConst.TAG_BLACKEP; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + } else { // wk and br or bq on rank 5 + BigInteger occupancyWithoutEPPawns = COMBINED_OCCUPANCIES.and(MoveConstants.SQUARE_BBS[starting_square].not()); + occupancyWithoutEPPawns = occupancyWithoutEPPawns.and(MoveConstants.SQUARE_BBS[Board.ep - 8].not()); + + BigInteger rookAttacksFromKing = MoveUtils.GetRookMovesSeparate(occupancyWithoutEPPawns, blackKingPosition); + + if (isZero(rookAttacksFromKing.and(Board.bitboard_array_global[GenConst.WR]))) + { + if (isZero(rookAttacksFromKing.and(Board.bitboard_array_global[GenConst.WQ]))) + { + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = Board.ep; + move_list[move_count][MOVE_TAG] = GenConst.TAG_BLACKEP; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + } + } + } + } + } + } + + //#endregion + } + + //#endregion + + //#region Black rook moves + + temp_bitboard = Board.bitboard_array_global[GenConst.BR]; + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + starting_square = BitScanForward(temp_bitboard); + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + + // Pr.print(" rook square: "); + // Pr.printIntLn(starting_square); + + temp_pin_bitboard = MAX_ULONG; + if (pinNumber != 0) + { + for (int i = 0; i < pinNumber; i++) + { + if (pinArray[i][PINNED_SQUARE_INDEX] == starting_square) + { + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[blackKingPosition][pinArray[i][PINNING_PIECE_INDEX]]; + } + } + } + + BigInteger rookAttacks = MoveUtils.GetRookMovesSeparate(COMBINED_OCCUPANCIES, starting_square); + + // Pr.print("rook attacks:"); + // Pr.printBigIntegerLn(rookAttacks); + + temp_attack = ((rookAttacks.and(WHITE_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + + // Pr.print("against white:"); + // Pr.printBigIntegerLn(temp_attack); + + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_CAPTURE; + move_list[move_count][MOVE_PIECE] = GenConst.BR; + move_count++; + } + + temp_attack = ((rookAttacks.and(EMPTY_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + // Pr.print("against empty:"); + // Pr.printBigIntegerLn(temp_attack); + + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_NONE; + move_list[move_count][MOVE_PIECE] = GenConst.BR; + move_count++; + } + } + + //#endregion + + //#region Black bishop moves + + temp_bitboard = Board.bitboard_array_global[GenConst.BB]; + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + starting_square = BitScanForward(temp_bitboard); + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + + temp_pin_bitboard = MAX_ULONG; + if (pinNumber != 0) + { + for (int i = 0; i < pinNumber; i++) + { + if (pinArray[i][PINNED_SQUARE_INDEX] == starting_square) + { + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[blackKingPosition][pinArray[i][PINNING_PIECE_INDEX]]; + } + } + } + + BigInteger bishopAttacks = MoveUtils.GetBishopMovesSeparate(COMBINED_OCCUPANCIES, starting_square); + + temp_attack = ((bishopAttacks.and(WHITE_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_CAPTURE; + move_list[move_count][MOVE_PIECE] = GenConst.BB; + move_count++; + } + + temp_attack = ((bishopAttacks.and(EMPTY_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_NONE; + move_list[move_count][MOVE_PIECE] = GenConst.BB; + move_count++; + } + } + + //#endregion + + //#region Black queen moves + + temp_bitboard = Board.bitboard_array_global[GenConst.BQ]; + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + starting_square = BitScanForward(temp_bitboard); + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + + temp_pin_bitboard = MAX_ULONG; + if (pinNumber != 0) + { + for (int i = 0; i < pinNumber; i++) + { + if (pinArray[i][PINNED_SQUARE_INDEX] == starting_square) + { + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[blackKingPosition][pinArray[i][PINNING_PIECE_INDEX]]; + } + } + } + + BigInteger queenAttacks = MoveUtils.GetRookMovesSeparate(COMBINED_OCCUPANCIES, starting_square); + queenAttacks = queenAttacks.or(MoveUtils.GetBishopMovesSeparate(COMBINED_OCCUPANCIES, starting_square)); + + temp_attack = ((queenAttacks.and(BLACK_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + + + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_CAPTURE; + move_list[move_count][MOVE_PIECE] = GenConst.BQ; + move_count++; + } + + temp_attack = ((queenAttacks.and(EMPTY_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_NONE; + move_list[move_count][MOVE_PIECE] = GenConst.BQ; + move_count++; + } + } + + //#endregion + } + } + + //#endregion + Pr.println("-generated moves, count: " + move_count); + return move_count; + } + + + static int PerftInlineDebug(int depth, int ply) + { + if (depth == 0) + { + return 1; + } + + BigInteger[] bitboard_array_copy = new BigInteger[12]; + + for (int i = 0; i < 12; i++) + { + bitboard_array_copy[i] = Board.bitboard_array_global[i]; + } + + int[][] move_list = new int[250][4]; + int move_count = getMoves(move_list); + + // Pr.print("Move count: "); + // Pr.printIntLn(move_count); + + //if (depth == 1) + //{ + //return move_count; + //} + + int nodes = 0; + int priorNodes; + int copyEp = Board.ep; + + boolean[] copy_castle = { + Board.castle_rights_global[0], + Board.castle_rights_global[1], + Board.castle_rights_global[2], + Board.castle_rights_global[3], + }; + + Pr.println(" -Looping through moves"); + for (int move_index = 0; move_index < move_count; move_index++) + { + int startingSquare = move_list[move_index][MOVE_STARTING]; + int targetSquare = move_list[move_index][MOVE_TARGET]; + int piece = move_list[move_index][MOVE_PIECE]; + int tag = move_list[move_index][MOVE_TAG]; + + int captureIndex = makeMove(piece, tag, startingSquare, targetSquare); + + priorNodes = nodes; + nodes += PerftInlineDebug(depth - 1, ply + 1); + + unmakeMove(piece, tag, startingSquare, targetSquare, captureIndex); + + Board.castle_rights_global[0] = copy_castle[0]; + Board.castle_rights_global[1] = copy_castle[1]; + Board.castle_rights_global[2] = copy_castle[2]; + Board.castle_rights_global[3] = copy_castle[3]; + Board.ep = copyEp; + + for (int i = 0; i < 12; i++) + { + Pr.println("i: " + i + " bitboard: " + Board.bitboard_array_global[i]); + assert Board.bitboard_array_global[i] == bitboard_array_copy[i] : "Bitboards are not the same!"; + } + + if (ply == 0) + { + //Pr.printInt(startingSquare); + //Pr.printInt(targetSquare); + //Pr.printInt(tag); + PrintMoveNoNL(startingSquare, targetSquare, tag); + System.out.printf(": %d\n", nodes - priorNodes); + } + } + + return nodes; + } + + + + static int PerftInlineGlobal(int depth, int ply) + { + if (depth == 0) + { + return 1; + } + + int[][] move_list = new int[250][4]; + int move_count = 0; + + //Move generating variables + BigInteger WHITE_OCCUPANCIES = Board.bitboard_array_global[0] + .or(Board.bitboard_array_global[1]) + .or(Board.bitboard_array_global[2]) + .or(Board.bitboard_array_global[3]) + .or(Board.bitboard_array_global[4]) + .or(Board.bitboard_array_global[5]); + BigInteger BLACK_OCCUPANCIES = Board.bitboard_array_global[6] + .or(Board.bitboard_array_global[7]) + .or(Board.bitboard_array_global[8]) + .or(Board.bitboard_array_global[9]) + .or(Board.bitboard_array_global[10]) + .or(Board.bitboard_array_global[11]); + BigInteger COMBINED_OCCUPANCIES = WHITE_OCCUPANCIES.or(BLACK_OCCUPANCIES); + BigInteger EMPTY_OCCUPANCIES = COMBINED_OCCUPANCIES.not(); + BigInteger temp_bitboard, temp_pin_bitboard, temp_attack, temp_empty, temp_captures; + BigInteger check_bitboard = new BigInteger("0"); + int starting_square = NO_SQUARE, target_square = NO_SQUARE; + + int[][] pinArray = + { + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + { -1, -1 }, + }; + + int pinNumber = 0; + + if (Board.is_white_global == true) + { + int whiteKingCheckCount = 0; + int whiteKingPosition = BitScanForward(Board.bitboard_array_global[GenConst.WK]); + + //#region White checks and pins + + //pawns + temp_bitboard = Board.bitboard_array_global[GenConst.BP].and(MoveConstants.WHITE_PAWN_ATTACKS[whiteKingPosition]); + if (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + int pawn_square = BitScanForward(temp_bitboard); + + if (check_bitboard.compareTo(BigInteger.ZERO) != 0) + { + check_bitboard = MoveConstants.SQUARE_BBS[pawn_square]; + } + + whiteKingCheckCount++; + } + + //knights + temp_bitboard = Board.bitboard_array_global[GenConst.BN].and(MoveConstants.KNIGHT_ATTACKS[whiteKingPosition]); + if (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + int knight_square = BitScanForward(temp_bitboard); + + if (check_bitboard.compareTo(BigInteger.ZERO) != 0) + { + check_bitboard = MoveConstants.SQUARE_BBS[knight_square]; + } + + whiteKingCheckCount++; + } + + //bishops + BigInteger bishopAttacksChecks = MoveUtils.GetBishopMovesSeparate(BLACK_OCCUPANCIES, whiteKingPosition); + temp_bitboard = Board.bitboard_array_global[GenConst.BB].and(bishopAttacksChecks); + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + int piece_square = BitScanForward(temp_bitboard); + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[whiteKingPosition][piece_square].and(WHITE_OCCUPANCIES); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + if (check_bitboard.compareTo(BigInteger.ZERO) != 0) + { + check_bitboard = Inb.INBETWEEN_BITBOARDS[whiteKingPosition][piece_square]; + } + whiteKingCheckCount++; + } + else + { + int pinned_square = BitScanForward(temp_pin_bitboard); + temp_pin_bitboard = temp_pin_bitboard.and(temp_pin_bitboard.subtract(BigInteger.ONE)); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + pinArray[pinNumber][PINNED_SQUARE_INDEX] = pinned_square; + pinArray[pinNumber][PINNING_PIECE_INDEX] = piece_square; + pinNumber++; + } + } + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + } + + //queen + temp_bitboard = Board.bitboard_array_global[GenConst.BQ].and(bishopAttacksChecks); + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + int piece_square = BitScanForward(temp_bitboard); + + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[whiteKingPosition][piece_square].and(WHITE_OCCUPANCIES); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + if (check_bitboard.compareTo(BigInteger.ZERO) != 0) + { + check_bitboard = Inb.INBETWEEN_BITBOARDS[whiteKingPosition][piece_square]; + } + whiteKingCheckCount++; + } + else + { + int pinned_square = BitScanForward(temp_pin_bitboard); + temp_pin_bitboard = temp_pin_bitboard.and(temp_pin_bitboard.subtract(BigInteger.ONE)); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + pinArray[pinNumber][PINNED_SQUARE_INDEX] = pinned_square; + pinArray[pinNumber][PINNING_PIECE_INDEX] = piece_square; + pinNumber++; + } + } + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + } + + //rook + BigInteger rook_attacks = MoveUtils.GetRookMovesSeparate(BLACK_OCCUPANCIES, whiteKingPosition); + temp_bitboard = Board.bitboard_array_global[GenConst.BR].and(rook_attacks); + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + int piece_square = BitScanForward(temp_bitboard); + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[whiteKingPosition][piece_square].and(WHITE_OCCUPANCIES); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + if (check_bitboard.compareTo(BigInteger.ZERO) != 0) + { + check_bitboard = Inb.INBETWEEN_BITBOARDS[whiteKingPosition][piece_square]; + } + whiteKingCheckCount++; + } + else + { + int pinned_square = BitScanForward(temp_pin_bitboard); + temp_pin_bitboard = temp_pin_bitboard.and(temp_pin_bitboard.subtract(BigInteger.ONE)); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + pinArray[pinNumber][PINNED_SQUARE_INDEX] = pinned_square; + pinArray[pinNumber][PINNING_PIECE_INDEX] = piece_square; + pinNumber++; + } + } + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + } + + //queen + temp_bitboard = Board.bitboard_array_global[GenConst.BQ].and(rook_attacks); + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + int piece_square = BitScanForward(temp_bitboard); + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[whiteKingPosition][piece_square].and(WHITE_OCCUPANCIES); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + if (check_bitboard.compareTo(BigInteger.ZERO) != 0) + { + check_bitboard = Inb.INBETWEEN_BITBOARDS[whiteKingPosition][piece_square]; + } + whiteKingCheckCount++; + } + else + { + int pinned_square = BitScanForward(temp_pin_bitboard); + temp_pin_bitboard = temp_pin_bitboard.and(temp_pin_bitboard.subtract(BigInteger.ONE)); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + pinArray[pinNumber][PINNED_SQUARE_INDEX] = pinned_square; + pinArray[pinNumber][PINNING_PIECE_INDEX] = piece_square; + pinNumber++; + } + } + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + } + + //#endregion + + BigInteger occupanciesWithoutWhiteKing = COMBINED_OCCUPANCIES.and(Board.bitboard_array_global[GenConst.WK].not()); + + temp_attack = MoveConstants.KING_ATTACKS[whiteKingPosition]; + temp_empty = temp_attack.and(EMPTY_OCCUPANCIES); + while (temp_empty.signum() != 0) // Using BigInteger's signum() to check if it's not 0 + { + target_square = BitScanForward(temp_empty); + temp_empty = temp_empty.and(temp_empty.subtract(BigInteger.ONE)); // Using BigInteger's subtract and and + + if (Board.bitboard_array_global[GenConst.BP].and(MoveConstants.WHITE_PAWN_ATTACKS[target_square]).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.BN].and(MoveConstants.KNIGHT_ATTACKS[target_square]).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.BK].and(MoveConstants.KING_ATTACKS[target_square]).signum() != 0) { + continue; + } + BigInteger bishopAttacks = MoveUtils.GetBishopMovesSeparate(occupanciesWithoutWhiteKing, target_square); + if (Board.bitboard_array_global[GenConst.BB].and(bishopAttacks).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.BQ].and(bishopAttacks).signum() != 0) { + continue; + } + BigInteger rookAttacks = MoveUtils.GetRookMovesSeparate(occupanciesWithoutWhiteKing, target_square); + if (Board.bitboard_array_global[GenConst.BR].and(rookAttacks).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.BQ].and(rookAttacks).signum() != 0) { + continue; + } + + move_list[move_count][MOVE_STARTING] = whiteKingPosition; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_NONE; + move_list[move_count][MOVE_PIECE] = GenConst.WK; + move_count++; + } + + //captures + temp_captures = temp_attack.and(BLACK_OCCUPANCIES); + while (temp_captures.signum() != 0) // Using BigInteger's signum() to check if it's not 0 + { + target_square = BitScanForward(temp_captures); + temp_captures = temp_captures.and(temp_captures.subtract(BigInteger.ONE)); // Using BigInteger's subtract and and + + if (Board.bitboard_array_global[GenConst.BP].and(MoveConstants.WHITE_PAWN_ATTACKS[target_square]).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.BN].and(MoveConstants.KNIGHT_ATTACKS[target_square]).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.BK].and(MoveConstants.KING_ATTACKS[target_square]).signum() != 0) { + continue; + } + BigInteger bishopAttacks = MoveUtils.GetBishopMovesSeparate(occupanciesWithoutWhiteKing, target_square); + if (Board.bitboard_array_global[GenConst.BB].and(bishopAttacks).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.BQ].and(bishopAttacks).signum() != 0) { + continue; + } + BigInteger rookAttacks = MoveUtils.GetRookMovesSeparate(occupanciesWithoutWhiteKing, target_square); + if (Board.bitboard_array_global[GenConst.BR].and(rookAttacks).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.BQ].and(rookAttacks).signum() != 0) { + continue; + } + + move_list[move_count][MOVE_STARTING] = whiteKingPosition; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_CAPTURE; + move_list[move_count][MOVE_PIECE] = GenConst.WK; + move_count++; + } + + if (whiteKingCheckCount < 2) + { + + if (whiteKingCheckCount == 0) + { + check_bitboard = MAX_ULONG; + } + + //#region White castling + + if (whiteKingCheckCount == 0) + { + if (Board.castle_rights_global[WKS_CASTLE_RIGHTS] == true) + { + if (whiteKingPosition == GenConst.E1) //king on e1 + { + if (isNotZero(WKS_EMPTY_BITBOARD.and(COMBINED_OCCUPANCIES)) == false) //f1 and g1 empty + { + if (isNotZero(Board.bitboard_array_global[GenConst.WR].and(MoveConstants.SQUARE_BBS[GenConst.H1])) == false) //rook on h1 + { + if (MoveUtils.Is_Square_Attacked_By_Black_Global(GenConst.F1, COMBINED_OCCUPANCIES) == false) + { + if (MoveUtils.Is_Square_Attacked_By_Black_Global(GenConst.G1, COMBINED_OCCUPANCIES) == false) + { + move_list[move_count][MOVE_STARTING] = GenConst.E1; + move_list[move_count][MOVE_TARGET] = GenConst.G1; + move_list[move_count][MOVE_TAG] = GenConst.TAG_WCASTLEKS; + move_list[move_count][MOVE_PIECE] = GenConst.WK; + move_count++; + } + } + } + } + } + } + if (Board.castle_rights_global[WQS_CASTLE_RIGHTS] == true) + { + if (whiteKingPosition == GenConst.E1) //king on e1 + { + if (isNotZero(WQS_EMPTY_BITBOARD.and(COMBINED_OCCUPANCIES)) == false) //f1 and g1 empty + { + if ((isNotZero(Board.bitboard_array_global[GenConst.WR].and(MoveConstants.SQUARE_BBS[GenConst.A1]))) == true) //rook on h1 + { + if (MoveUtils.Is_Square_Attacked_By_Black_Global(GenConst.C1, COMBINED_OCCUPANCIES) == false) + { + if (MoveUtils.Is_Square_Attacked_By_Black_Global(GenConst.D1, COMBINED_OCCUPANCIES) == false) + { + move_list[move_count][MOVE_STARTING] = GenConst.E1; + move_list[move_count][MOVE_TARGET] = GenConst.C1; + move_list[move_count][MOVE_TAG] = GenConst.TAG_WCASTLEQS; + move_list[move_count][MOVE_PIECE] = GenConst.WK; + move_count++; + } + } + } + } + } + } + } + + //#endregion + + //#region White knight moves + + temp_bitboard = Board.bitboard_array_global[GenConst.WN]; + + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + starting_square = BitScanForward(temp_bitboard); + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); //removes the knight from that square to not infinitely loop + + temp_pin_bitboard = MAX_ULONG; + if (pinNumber != 0) + { + for (int i = 0; i < pinNumber; i++) + { + if (pinArray[i][PINNED_SQUARE_INDEX] == starting_square) + { + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[whiteKingPosition][pinArray[i][PINNING_PIECE_INDEX]]; + } + } + } + + temp_attack = ((MoveConstants.KNIGHT_ATTACKS[starting_square].and(BLACK_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); //gets knight captures + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_CAPTURE; + move_list[move_count][MOVE_PIECE] = GenConst.WN; + move_count++; + } + + temp_attack = ((MoveConstants.KNIGHT_ATTACKS[starting_square].and(EMPTY_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_NONE; + move_list[move_count][MOVE_PIECE] = GenConst.WN; + move_count++; + } + } + + //#endregion + + //#region White pawn moves + + temp_bitboard = Board.bitboard_array_global[GenConst.WP]; + + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + starting_square = BitScanForward(temp_bitboard); + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + + temp_pin_bitboard = MAX_ULONG; + if (pinNumber != 0) + { + for (int i = 0; i < pinNumber; i++) + { + if (pinArray[i][PINNED_SQUARE_INDEX] == starting_square) + { + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[whiteKingPosition][pinArray[i][PINNING_PIECE_INDEX]]; + } + } + } + + //#region pawn forward + + if (isZero(MoveConstants.SQUARE_BBS[starting_square - 8].and(COMBINED_OCCUPANCIES)) == true) //if up one square is empty + { + if (isNotZero(MoveConstants.SQUARE_BBS[starting_square - 8].and(check_bitboard).and(temp_pin_bitboard)) == true) //if not pinned or check + { + if (isNotZero(MoveConstants.SQUARE_BBS[starting_square].and(RANK_7_BITBOARD))) //if promotion + { + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = starting_square - 8; + move_list[move_count][MOVE_TAG] = GenConst.TAG_WQueenPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = starting_square - 8; + move_list[move_count][MOVE_TAG] = GenConst.TAG_WRookPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = starting_square - 8; + move_list[move_count][MOVE_TAG] = GenConst.TAG_WBishopPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = starting_square - 8; + move_list[move_count][MOVE_TAG] = GenConst.TAG_WBishopPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + + } + else + { + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = starting_square - 8; + move_list[move_count][MOVE_TAG] = GenConst.TAG_NONE; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + } + } + + if ((isNotZero(MoveConstants.SQUARE_BBS[starting_square].and(RANK_2_BITBOARD))) == true) //if on rank 2 + { + if (isNotZero(MoveConstants.SQUARE_BBS[starting_square - 16].and(check_bitboard).and(temp_pin_bitboard)) == true) //if not pinned or + { + if (isZero(MoveConstants.SQUARE_BBS[starting_square - 16].and(COMBINED_OCCUPANCIES)) == true) //if up two squares and one square are empty + { + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = starting_square - 16; + move_list[move_count][MOVE_TAG] = GenConst.TAG_DoublePawnWhite; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + } + } + } + } + + //#endregion + //#region pawn attacks + + temp_attack = ((MoveConstants.WHITE_PAWN_ATTACKS[starting_square].and(BLACK_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); //if black piece diagonal to pawn + + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + if (isNotZero(MoveConstants.SQUARE_BBS[starting_square].and(RANK_7_BITBOARD)) == true) //if promotion + { + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_WCaptureQueenPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_WCaptureRookPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_WCaptureBishopPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_WCaptureKnightPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + } + else + { + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_CAPTURE; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + } + } + + if (isNotZero(MoveConstants.SQUARE_BBS[starting_square].and(RANK_5_BITBOARD))) + { // check rank for ep + if (Board.ep != NO_SQUARE) + { + if (isNotZero(MoveConstants.WHITE_PAWN_ATTACKS[starting_square] + .and(MoveConstants.SQUARE_BBS[Board.ep]) + .and(check_bitboard) + .and(temp_pin_bitboard))) { + if (isZero(Board.bitboard_array_global[GenConst.WK].and(RANK_5_BITBOARD))) { // if no king on rank 5 + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = Board.ep; + move_list[move_count][MOVE_TAG] = GenConst.TAG_WHITEEP; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + } else if (isZero(Board.bitboard_array_global[GenConst.BR].and(RANK_5_BITBOARD)) && + isZero(Board.bitboard_array_global[GenConst.BQ].and(RANK_5_BITBOARD))) { // if no b rook or queen on rank 5 + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = Board.ep; + move_list[move_count][MOVE_TAG] = GenConst.TAG_WHITEEP; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + } else { // wk and br or bq on rank 5 + BigInteger occupancyWithoutEPPawns = COMBINED_OCCUPANCIES.and(MoveConstants.SQUARE_BBS[starting_square].not()); + occupancyWithoutEPPawns = occupancyWithoutEPPawns.and(MoveConstants.SQUARE_BBS[Board.ep + 8].not()); + + BigInteger rookAttacksFromKing = MoveUtils.GetRookMovesSeparate(occupancyWithoutEPPawns, whiteKingPosition); + + if (isZero(rookAttacksFromKing.and(Board.bitboard_array_global[GenConst.BR]))) + { + if (isZero(rookAttacksFromKing.and(Board.bitboard_array_global[GenConst.BQ]))) + { + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = Board.ep; + move_list[move_count][MOVE_TAG] = GenConst.TAG_WHITEEP; + move_list[move_count][MOVE_PIECE] = GenConst.WP; + move_count++; + } + } + } + } + } + } + + //#endregion + } + + //#endregion + + //#region White rook moves + + temp_bitboard = Board.bitboard_array_global[GenConst.WR]; + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + starting_square = BitScanForward(temp_bitboard); + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + + temp_pin_bitboard = MAX_ULONG; + if (pinNumber != 0) + { + for (int i = 0; i < pinNumber; i++) + { + if (pinArray[i][PINNED_SQUARE_INDEX] == starting_square) + { + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[whiteKingPosition][pinArray[i][PINNING_PIECE_INDEX]]; + } + } + } + + BigInteger rookAttacks = MoveUtils.GetRookMovesSeparate(COMBINED_OCCUPANCIES, starting_square); + + temp_attack = ((rookAttacks.and(BLACK_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_CAPTURE; + move_list[move_count][MOVE_PIECE] = GenConst.WR; + move_count++; + } + + temp_attack = ((rookAttacks.and(EMPTY_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_NONE; + move_list[move_count][MOVE_PIECE] = GenConst.WR; + move_count++; + } + } + + //#endregion + + //#region White bishop moves + + //Pr.println("\nwhite bishop"); + temp_bitboard = Board.bitboard_array_global[GenConst.WB]; + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + starting_square = BitScanForward(temp_bitboard); + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + + temp_pin_bitboard = MAX_ULONG; + if (pinNumber != 0) + { + for (int i = 0; i < pinNumber; i++) + { + if (pinArray[i][PINNED_SQUARE_INDEX] == starting_square) + { + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[whiteKingPosition][pinArray[i][PINNING_PIECE_INDEX]]; + } + } + } + + //Pr.println("get bishop attacks"); + BigInteger bishopAttacks = MoveUtils.GetBishopMovesSeparate(COMBINED_OCCUPANCIES, starting_square); + //Pr.println("bishop attacks"); + //Pr.printBigIntegerLn(bishopAttacks); + + temp_attack = ((bishopAttacks.and(BLACK_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_CAPTURE; + move_list[move_count][MOVE_PIECE] = GenConst.WB; + move_count++; + } + + temp_attack = ((bishopAttacks.and(EMPTY_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_NONE; + move_list[move_count][MOVE_PIECE] = GenConst.WB; + move_count++; + } + } + + //#endregion + + //#region White queen moves + + temp_bitboard = Board.bitboard_array_global[GenConst.WQ]; + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + starting_square = BitScanForward(temp_bitboard); + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + + temp_pin_bitboard = MAX_ULONG; + if (pinNumber != 0) + { + for (int i = 0; i < pinNumber; i++) + { + if (pinArray[i][PINNED_SQUARE_INDEX] == starting_square) + { + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[whiteKingPosition][pinArray[i][PINNING_PIECE_INDEX]]; + } + } + } + + BigInteger queenAttacks = MoveUtils.GetRookMovesSeparate(COMBINED_OCCUPANCIES, starting_square); + queenAttacks = queenAttacks.and(MoveUtils.GetBishopMovesSeparate(COMBINED_OCCUPANCIES, starting_square)); + + temp_attack = ((queenAttacks.and(BLACK_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_CAPTURE; + move_list[move_count][MOVE_PIECE] = GenConst.WQ; + move_count++; + } + + temp_attack = ((queenAttacks.and(EMPTY_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_NONE; + move_list[move_count][MOVE_PIECE] = GenConst.WQ; + move_count++; + } + } + + //#endregion + } + } + else //black move + { + int blackKingCheckCount = 0; + int blackKingPosition = BitScanForward(Board.bitboard_array_global[GenConst.BK]); + + //#region black checks and pins + + //pawns + temp_bitboard = Board.bitboard_array_global[GenConst.WP].and(MoveConstants.BLACK_PAWN_ATTACKS[blackKingPosition]); + if (temp_bitboard.compareTo(BigInteger.ZERO) != 0) //if there is pawn attacking king + { + int pawn_square = BitScanForward(temp_bitboard); + + if (check_bitboard.compareTo(BigInteger.ZERO) != 0) + { + check_bitboard = MoveConstants.SQUARE_BBS[pawn_square]; + } + + blackKingCheckCount++; + } + + //knights + temp_bitboard = Board.bitboard_array_global[GenConst.WN].and(MoveConstants.KNIGHT_ATTACKS[blackKingPosition]); + if (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + int knight_square = BitScanForward(temp_bitboard); + + if (check_bitboard.compareTo(BigInteger.ZERO) != 0) + { + check_bitboard = MoveConstants.SQUARE_BBS[knight_square]; + } + + blackKingCheckCount++; + } + + //bishops + BigInteger bishopAttacksChecks = MoveUtils.GetBishopMovesSeparate(WHITE_OCCUPANCIES, blackKingPosition); + temp_bitboard = Board.bitboard_array_global[GenConst.WB].and(bishopAttacksChecks); + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + int piece_square = BitScanForward(temp_bitboard); + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[blackKingPosition][piece_square].and(BLACK_OCCUPANCIES); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + if (check_bitboard.compareTo(BigInteger.ZERO) != 0) + { + check_bitboard = Inb.INBETWEEN_BITBOARDS[blackKingPosition][piece_square]; + } + blackKingCheckCount++; + } + else + { + int pinned_square = BitScanForward(temp_pin_bitboard); + temp_pin_bitboard = temp_pin_bitboard.and(temp_pin_bitboard.subtract(BigInteger.ONE)); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + pinArray[pinNumber][PINNED_SQUARE_INDEX] = pinned_square; + pinArray[pinNumber][PINNING_PIECE_INDEX] = piece_square; + pinNumber++; + } + } + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + } + + //queen + temp_bitboard = Board.bitboard_array_global[GenConst.WQ].and(bishopAttacksChecks); + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + int piece_square = BitScanForward(temp_bitboard); + + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[blackKingPosition][piece_square].and(BLACK_OCCUPANCIES); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + if (check_bitboard.compareTo(BigInteger.ZERO) != 0) + { + check_bitboard = Inb.INBETWEEN_BITBOARDS[blackKingPosition][piece_square]; + } + blackKingCheckCount++; + } + else + { + int pinned_square = BitScanForward(temp_pin_bitboard); + temp_pin_bitboard = temp_pin_bitboard.and(temp_pin_bitboard.subtract(BigInteger.ONE)); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + pinArray[pinNumber][PINNED_SQUARE_INDEX] = pinned_square; + pinArray[pinNumber][PINNING_PIECE_INDEX] = piece_square; + pinNumber++; + } + } + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + } + + //rook + BigInteger rook_attacks = MoveUtils.GetRookMovesSeparate(WHITE_OCCUPANCIES, blackKingPosition); + temp_bitboard = Board.bitboard_array_global[GenConst.WR].and(rook_attacks); + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + int piece_square = BitScanForward(temp_bitboard); + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[blackKingPosition][piece_square].and(BLACK_OCCUPANCIES); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + if (check_bitboard.compareTo(BigInteger.ZERO) != 0) + { + check_bitboard = Inb.INBETWEEN_BITBOARDS[blackKingPosition][piece_square]; + } + blackKingCheckCount++; + } + else + { + int pinned_square = BitScanForward(temp_pin_bitboard); + temp_pin_bitboard = temp_pin_bitboard.and(temp_pin_bitboard.subtract(BigInteger.ONE)); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + pinArray[pinNumber][PINNED_SQUARE_INDEX] = pinned_square; + pinArray[pinNumber][PINNING_PIECE_INDEX] = piece_square; + pinNumber++; + } + } + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + } + + //queen + temp_bitboard = Board.bitboard_array_global[GenConst.WQ].and(rook_attacks); + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + int piece_square = BitScanForward(temp_bitboard); + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[blackKingPosition][piece_square].and(WHITE_OCCUPANCIES); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + if (check_bitboard.compareTo(BigInteger.ZERO) != 0) + { + check_bitboard = Inb.INBETWEEN_BITBOARDS[blackKingPosition][piece_square]; + } + blackKingCheckCount++; + } + else + { + int pinned_square = BitScanForward(temp_pin_bitboard); + temp_pin_bitboard = temp_pin_bitboard.and(temp_pin_bitboard.subtract(BigInteger.ONE)); + + if (temp_pin_bitboard.compareTo(BigInteger.ZERO) != 0) + { + pinArray[pinNumber][PINNED_SQUARE_INDEX] = pinned_square; + pinArray[pinNumber][PINNING_PIECE_INDEX] = piece_square; + pinNumber++; + } + } + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + } + + //#endregion + + BigInteger occupanciesWithoutWhiteKing = COMBINED_OCCUPANCIES.and(Board.bitboard_array_global[GenConst.WK].not()); + + temp_attack = MoveConstants.KING_ATTACKS[blackKingPosition]; + temp_empty = temp_attack.and(EMPTY_OCCUPANCIES); + while (temp_empty.signum() != 0) // Using BigInteger's signum() to check if it's not 0 + { + target_square = BitScanForward(temp_empty); + temp_empty = temp_empty.and(temp_empty.subtract(BigInteger.ONE)); // Using BigInteger's subtract and and + + if (Board.bitboard_array_global[GenConst.WP].and(MoveConstants.BLACK_PAWN_ATTACKS[target_square]).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.WN].and(MoveConstants.KNIGHT_ATTACKS[target_square]).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.WK].and(MoveConstants.KING_ATTACKS[target_square]).signum() != 0) { + continue; + } + BigInteger bishopAttacks = MoveUtils.GetBishopMovesSeparate(occupanciesWithoutWhiteKing, target_square); + if (Board.bitboard_array_global[GenConst.WB].and(bishopAttacks).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.WQ].and(bishopAttacks).signum() != 0) { + continue; + } + BigInteger rookAttacks = MoveUtils.GetRookMovesSeparate(occupanciesWithoutWhiteKing, target_square); + if (Board.bitboard_array_global[GenConst.WR].and(rookAttacks).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.WQ].and(rookAttacks).signum() != 0) { + continue; + } + + move_list[move_count][MOVE_STARTING] = blackKingPosition; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_NONE; + move_list[move_count][MOVE_PIECE] = GenConst.BK; + move_count++; + } + + //captures + temp_captures = temp_attack.and(BLACK_OCCUPANCIES); + while (temp_captures.signum() != 0) // Using BigInteger's signum() to check if it's not 0 + { + target_square = BitScanForward(temp_captures); + temp_captures = temp_captures.and(temp_captures.subtract(BigInteger.ONE)); // Using BigInteger's subtract and and + + if (Board.bitboard_array_global[GenConst.WP].and(MoveConstants.BLACK_PAWN_ATTACKS[target_square]).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.WN].and(MoveConstants.KNIGHT_ATTACKS[target_square]).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.WK].and(MoveConstants.KING_ATTACKS[target_square]).signum() != 0) { + continue; + } + BigInteger bishopAttacks = MoveUtils.GetBishopMovesSeparate(occupanciesWithoutWhiteKing, target_square); + if (Board.bitboard_array_global[GenConst.WB].and(bishopAttacks).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.WQ].and(bishopAttacks).signum() != 0) { + continue; + } + BigInteger rookAttacks = MoveUtils.GetRookMovesSeparate(occupanciesWithoutWhiteKing, target_square); + if (Board.bitboard_array_global[GenConst.WR].and(rookAttacks).signum() != 0) { + continue; + } + if (Board.bitboard_array_global[GenConst.WQ].and(rookAttacks).signum() != 0) { + continue; + } + + move_list[move_count][MOVE_STARTING] = blackKingPosition; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_CAPTURE; + move_list[move_count][MOVE_PIECE] = GenConst.BK; + move_count++; + } + + if (blackKingCheckCount < 2) + { + + if (blackKingCheckCount == 0) + { + check_bitboard = MAX_ULONG; + } + + //#region Black castling + + if (blackKingCheckCount == 0) + { + if (Board.castle_rights_global[BKS_CASTLE_RIGHTS] == true) + { + if (blackKingPosition == GenConst.E8) //king on e1 + { + if (isNotZero(BKS_EMPTY_BITBOARD.and(COMBINED_OCCUPANCIES)) == false) //f1 and g1 empty + { + if (isNotZero(Board.bitboard_array_global[GenConst.BR].and(MoveConstants.SQUARE_BBS[GenConst.H8])) == false) //rook on h8 + { + if (MoveUtils.Is_Square_Attacked_By_White_Global(GenConst.F8, COMBINED_OCCUPANCIES) == false) + { + if (MoveUtils.Is_Square_Attacked_By_White_Global(GenConst.G8, COMBINED_OCCUPANCIES) == false) + { + move_list[move_count][MOVE_STARTING] = GenConst.E8; + move_list[move_count][MOVE_TARGET] = GenConst.G8; + move_list[move_count][MOVE_TAG] = GenConst.TAG_BCASTLEKS; + move_list[move_count][MOVE_PIECE] = GenConst.BK; + move_count++; + } + } + } + } + } + } + if (Board.castle_rights_global[BQS_CASTLE_RIGHTS] == true) + { + if (blackKingPosition == GenConst.E8) //king on e1 + { + if (isNotZero(BQS_EMPTY_BITBOARD.and(COMBINED_OCCUPANCIES)) == false) //f1 and g1 empty + { + if ((isNotZero(Board.bitboard_array_global[GenConst.BR].and(MoveConstants.SQUARE_BBS[GenConst.A8]))) == true) //rook on h1 + { + if (MoveUtils.Is_Square_Attacked_By_White_Global(GenConst.C8, COMBINED_OCCUPANCIES) == false) + { + if (MoveUtils.Is_Square_Attacked_By_White_Global(GenConst.D8, COMBINED_OCCUPANCIES) == false) + { + move_list[move_count][MOVE_STARTING] = GenConst.E8; + move_list[move_count][MOVE_TARGET] = GenConst.C8; + move_list[move_count][MOVE_TAG] = GenConst.TAG_BCASTLEQS; + move_list[move_count][MOVE_PIECE] = GenConst.BK; + move_count++; + } + } + } + } + } + } + } + + //#endregion + + //#region Black knight moves + + temp_bitboard = Board.bitboard_array_global[GenConst.BN]; + + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + starting_square = BitScanForward(temp_bitboard); + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); //removes the knight from that square to not infinitely loop + + temp_pin_bitboard = MAX_ULONG; + if (pinNumber != 0) + { + for (int i = 0; i < pinNumber; i++) + { + if (pinArray[i][PINNED_SQUARE_INDEX] == starting_square) + { + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[blackKingPosition][pinArray[i][PINNING_PIECE_INDEX]]; + } + } + } + + temp_attack = ((MoveConstants.KNIGHT_ATTACKS[starting_square].and(WHITE_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); //gets knight captures + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_CAPTURE; + move_list[move_count][MOVE_PIECE] = GenConst.BN; + move_count++; + } + + temp_attack = ((MoveConstants.KNIGHT_ATTACKS[starting_square].and(EMPTY_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_NONE; + move_list[move_count][MOVE_PIECE] = GenConst.BN; + move_count++; + } + } + + //#endregion + + //#region Black pawn moves + + temp_bitboard = Board.bitboard_array_global[GenConst.BP]; + + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + starting_square = BitScanForward(temp_bitboard); + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + + temp_pin_bitboard = MAX_ULONG; + if (pinNumber != 0) + { + for (int i = 0; i < pinNumber; i++) + { + if (pinArray[i][PINNED_SQUARE_INDEX] == starting_square) + { + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[blackKingPosition][pinArray[i][PINNING_PIECE_INDEX]]; + } + } + } + + //#region pawn forward + + if (isZero(MoveConstants.SQUARE_BBS[starting_square + 8].and(COMBINED_OCCUPANCIES)) == true) //if up one square is empty + { + if (isNotZero(MoveConstants.SQUARE_BBS[starting_square + 8].and(check_bitboard).and(temp_pin_bitboard)) == true) //if not pinned or check + { + if (isNotZero(MoveConstants.SQUARE_BBS[starting_square].and(RANK_2_BITBOARD))) //if promotion + { + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = starting_square + 8; + move_list[move_count][MOVE_TAG] = GenConst.TAG_BQueenPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = starting_square + 8; + move_list[move_count][MOVE_TAG] = GenConst.TAG_BRookPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = starting_square + 8; + move_list[move_count][MOVE_TAG] = GenConst.TAG_BBishopPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = starting_square + 8; + move_list[move_count][MOVE_TAG] = GenConst.TAG_BBishopPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + + } + else + { + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = starting_square + 8; + move_list[move_count][MOVE_TAG] = GenConst.TAG_NONE; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + } + } + + if ((isNotZero(MoveConstants.SQUARE_BBS[starting_square].and(RANK_7_BITBOARD))) == true) //if on rank 7 + { + if (isNotZero(MoveConstants.SQUARE_BBS[starting_square + 16].and(check_bitboard).and(temp_pin_bitboard)) == true) //if not pinned or + { + if (isZero(MoveConstants.SQUARE_BBS[starting_square + 16].and(COMBINED_OCCUPANCIES)) == true) //if up two squares and one square are empty + { + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = starting_square - 16; + move_list[move_count][MOVE_TAG] = GenConst.TAG_DoublePawnBlack; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + } + } + } + } + + //#endregion + //#region pawn attacks + + temp_attack = ((MoveConstants.BLACK_PAWN_ATTACKS[starting_square].and(BLACK_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); //if black piece diagonal to pawn + + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + if (isNotZero(MoveConstants.SQUARE_BBS[starting_square].and(RANK_2_BITBOARD)) == true) //if promotion + { + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_BCaptureQueenPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_BCaptureRookPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_BCaptureBishopPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_BCaptureKnightPromotion; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + } + else + { + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_CAPTURE; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + } + } + + if (isNotZero(MoveConstants.SQUARE_BBS[starting_square].and(RANK_4_BITBOARD))) + { // check rank for ep + if (Board.ep != NO_SQUARE) + { + if (isNotZero(MoveConstants.BLACK_PAWN_ATTACKS[starting_square] + .and(MoveConstants.SQUARE_BBS[Board.ep]) + .and(check_bitboard) + .and(temp_pin_bitboard))) { + if (isZero(Board.bitboard_array_global[GenConst.WK].and(RANK_5_BITBOARD))) { // if no king on rank 5 + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = Board.ep; + move_list[move_count][MOVE_TAG] = GenConst.TAG_BLACKEP; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + } else if (isZero(Board.bitboard_array_global[GenConst.WR].and(RANK_5_BITBOARD)) && + isZero(Board.bitboard_array_global[GenConst.WQ].and(RANK_5_BITBOARD))) { // if no b rook or queen on rank 5 + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = Board.ep; + move_list[move_count][MOVE_TAG] = GenConst.TAG_BLACKEP; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + } else { // wk and br or bq on rank 5 + BigInteger occupancyWithoutEPPawns = COMBINED_OCCUPANCIES.and(MoveConstants.SQUARE_BBS[starting_square].not()); + occupancyWithoutEPPawns = occupancyWithoutEPPawns.and(MoveConstants.SQUARE_BBS[Board.ep - 8].not()); + + BigInteger rookAttacksFromKing = MoveUtils.GetRookMovesSeparate(occupancyWithoutEPPawns, blackKingPosition); + + if (isZero(rookAttacksFromKing.and(Board.bitboard_array_global[GenConst.WR]))) + { + if (isZero(rookAttacksFromKing.and(Board.bitboard_array_global[GenConst.WQ]))) + { + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = Board.ep; + move_list[move_count][MOVE_TAG] = GenConst.TAG_BLACKEP; + move_list[move_count][MOVE_PIECE] = GenConst.BP; + move_count++; + } + } + } + } + } + } + + //#endregion + } + + //#endregion + + //#region Black rook moves + + temp_bitboard = Board.bitboard_array_global[GenConst.BR]; + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + starting_square = BitScanForward(temp_bitboard); + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + + temp_pin_bitboard = MAX_ULONG; + if (pinNumber != 0) + { + for (int i = 0; i < pinNumber; i++) + { + if (pinArray[i][PINNED_SQUARE_INDEX] == starting_square) + { + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[blackKingPosition][pinArray[i][PINNING_PIECE_INDEX]]; + } + } + } + + BigInteger rookAttacks = MoveUtils.GetRookMovesSeparate(COMBINED_OCCUPANCIES, starting_square); + + temp_attack = ((rookAttacks.and(WHITE_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_CAPTURE; + move_list[move_count][MOVE_PIECE] = GenConst.BR; + move_count++; + } + + temp_attack = ((rookAttacks.and(EMPTY_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_NONE; + move_list[move_count][MOVE_PIECE] = GenConst.BR; + move_count++; + } + } + + //#endregion + + //#region Black bishop moves + + temp_bitboard = Board.bitboard_array_global[GenConst.BB]; + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + starting_square = BitScanForward(temp_bitboard); + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + + temp_pin_bitboard = MAX_ULONG; + if (pinNumber != 0) + { + for (int i = 0; i < pinNumber; i++) + { + if (pinArray[i][PINNED_SQUARE_INDEX] == starting_square) + { + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[blackKingPosition][pinArray[i][PINNING_PIECE_INDEX]]; + } + } + } + + BigInteger bishopAttacks = MoveUtils.GetBishopMovesSeparate(COMBINED_OCCUPANCIES, starting_square); + + temp_attack = ((bishopAttacks.and(WHITE_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_CAPTURE; + move_list[move_count][MOVE_PIECE] = GenConst.BB; + move_count++; + } + + temp_attack = ((bishopAttacks.and(EMPTY_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_NONE; + move_list[move_count][MOVE_PIECE] = GenConst.BB; + move_count++; + } + } + + //#endregion + + //#region Black queen moves + + temp_bitboard = Board.bitboard_array_global[GenConst.BQ]; + while (temp_bitboard.compareTo(BigInteger.ZERO) != 0) + { + starting_square = BitScanForward(temp_bitboard); + temp_bitboard = temp_bitboard.and(temp_bitboard.subtract(BigInteger.ONE)); + + temp_pin_bitboard = MAX_ULONG; + if (pinNumber != 0) + { + for (int i = 0; i < pinNumber; i++) + { + if (pinArray[i][PINNED_SQUARE_INDEX] == starting_square) + { + temp_pin_bitboard = Inb.INBETWEEN_BITBOARDS[blackKingPosition][pinArray[i][PINNING_PIECE_INDEX]]; + } + } + } + + BigInteger queenAttacks = MoveUtils.GetRookMovesSeparate(COMBINED_OCCUPANCIES, starting_square); + queenAttacks = queenAttacks.and(MoveUtils.GetBishopMovesSeparate(COMBINED_OCCUPANCIES, starting_square)); + + temp_attack = ((queenAttacks.and(BLACK_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_CAPTURE; + move_list[move_count][MOVE_PIECE] = GenConst.BQ; + move_count++; + } + + temp_attack = ((queenAttacks.and(EMPTY_OCCUPANCIES).and(check_bitboard).and(temp_pin_bitboard))); + while (isNotZero(temp_attack)) + { + target_square = BitScanForward(temp_attack); + temp_attack = removeBit(temp_attack); + + move_list[move_count][MOVE_STARTING] = starting_square; + move_list[move_count][MOVE_TARGET] = target_square; + move_list[move_count][MOVE_TAG] = GenConst.TAG_NONE; + move_list[move_count][MOVE_PIECE] = GenConst.BQ; + move_count++; + } + } + + //#endregion + } + } + + //if (depth == 1) + //{ + //return move_count; + //} + + int nodes = 0; + int priorNodes; + int copyEp = Board.ep; + + boolean[] copy_castle = { + Board.castle_rights_global[0], + Board.castle_rights_global[1], + Board.castle_rights_global[2], + Board.castle_rights_global[3], + }; + + for (int move_index = 0; move_index < move_count; move_index++) + { + int startingSquare = move_list[move_index][MOVE_STARTING]; + int targetSquare = move_list[move_index][MOVE_TARGET]; + int piece = move_list[move_index][MOVE_PIECE]; + int tag = move_list[move_index][MOVE_TAG]; + + int captureIndex = -1; + + Board.is_white_global = !Board.is_white_global; + switch (tag) + { + case GenConst.TAG_NONE: //none + case GenConst.TAG_CHECK: //check + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + break; + case GenConst.TAG_CAPTURE: //capture + case GenConst.TAG_CHECK_CAPTURE: //check cap + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + if (piece >= GenConst.WP && piece <= GenConst.WK) + { + for (int i = GenConst.BP; i <= GenConst.WP; ++i) + { + if (isNotZero((Board.bitboard_array_global[i].and(MoveConstants.SQUARE_BBS[targetSquare])))) + { + captureIndex = i; + break; + } + } + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + } + else //is black + { + for (int i = GenConst.WP; i <= GenConst.WK; ++i) + { + if (isNotZero((Board.bitboard_array_global[i].and(MoveConstants.SQUARE_BBS[targetSquare])))) + { + captureIndex = i; + break; + } + } + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + } + + Board.ep = NO_SQUARE; + break; + case GenConst.TAG_WHITEEP: //white ep + //move piece + Board.bitboard_array_global[GenConst.WP] =Board.bitboard_array_global[GenConst.WP].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[GenConst.WP] =Board.bitboard_array_global[GenConst.WP].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.bitboard_array_global[GenConst.BP] =Board.bitboard_array_global[GenConst.BP].and(MoveConstants.SQUARE_BBS[targetSquare + 8].not()); + Board.ep = NO_SQUARE; + break; + case GenConst.TAG_BLACKEP: //black ep + Board.bitboard_array_global[GenConst.BP] =Board.bitboard_array_global[GenConst.BP].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[GenConst.BP] =Board.bitboard_array_global[GenConst.BP].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.bitboard_array_global[GenConst.WP] =Board.bitboard_array_global[GenConst.WP].and(MoveConstants.SQUARE_BBS[targetSquare - 8].not()); + Board.ep = NO_SQUARE; + break; + + case GenConst.TAG_WCASTLEKS: //WKS + //white king + Board.bitboard_array_global[GenConst.WK] =Board.bitboard_array_global[GenConst.WK].or(MoveConstants.SQUARE_BBS[GenConst.G1]); + Board.bitboard_array_global[GenConst.WK] =Board.bitboard_array_global[GenConst.WK].and(MoveConstants.SQUARE_BBS[GenConst.E1].not()); + Board.bitboard_array_global[GenConst.WR] =Board.bitboard_array_global[GenConst.WR].or(MoveConstants.SQUARE_BBS[GenConst.F1]); + Board.bitboard_array_global[GenConst.WR] =Board.bitboard_array_global[GenConst.WR].and(MoveConstants.SQUARE_BBS[GenConst.H1].not()); + + Board.castle_rights_global[WKS_CASTLE_RIGHTS] = false; + Board.castle_rights_global[WQS_CASTLE_RIGHTS] = false; + Board.ep = NO_SQUARE; + break; + case GenConst.TAG_WCASTLEQS: //WQS + Board.bitboard_array_global[GenConst.WK] =Board.bitboard_array_global[GenConst.WK].or(MoveConstants.SQUARE_BBS[GenConst.C1]); + Board.bitboard_array_global[GenConst.WK] =Board.bitboard_array_global[GenConst.WK].and(MoveConstants.SQUARE_BBS[GenConst.E1].not()); + Board.bitboard_array_global[GenConst.WR] =Board.bitboard_array_global[GenConst.WR].or(MoveConstants.SQUARE_BBS[GenConst.D1]); + Board.bitboard_array_global[GenConst.WR] =Board.bitboard_array_global[GenConst.WR].and(MoveConstants.SQUARE_BBS[GenConst.A1].not()); + + Board.castle_rights_global[WKS_CASTLE_RIGHTS] = false; + Board.castle_rights_global[WQS_CASTLE_RIGHTS] = false; + Board.ep = NO_SQUARE; + break; + case GenConst.TAG_BCASTLEKS: //BKS + Board.bitboard_array_global[GenConst.BK] =Board.bitboard_array_global[GenConst.BK].or(MoveConstants.SQUARE_BBS[GenConst.G8]); + Board.bitboard_array_global[GenConst.BK] =Board.bitboard_array_global[GenConst.BK].and(MoveConstants.SQUARE_BBS[GenConst.E8].not()); + Board.bitboard_array_global[GenConst.BR] =Board.bitboard_array_global[GenConst.BR].or(MoveConstants.SQUARE_BBS[GenConst.F8]); + Board.bitboard_array_global[GenConst.BR] =Board.bitboard_array_global[GenConst.BR].and(MoveConstants.SQUARE_BBS[GenConst.H8].not()); + + Board.castle_rights_global[BKS_CASTLE_RIGHTS] = false; + Board.castle_rights_global[BQS_CASTLE_RIGHTS] = false; + Board.ep = NO_SQUARE; + break; + case GenConst.TAG_BCASTLEQS: //BQS + Board.bitboard_array_global[GenConst.BK] =Board.bitboard_array_global[GenConst.BK].or(MoveConstants.SQUARE_BBS[GenConst.C8]); + Board.bitboard_array_global[GenConst.BK] =Board.bitboard_array_global[GenConst.BK].and(MoveConstants.SQUARE_BBS[GenConst.E8].not()); + Board.bitboard_array_global[GenConst.BR] =Board.bitboard_array_global[GenConst.BR].or(MoveConstants.SQUARE_BBS[GenConst.D8]); + Board.bitboard_array_global[GenConst.BR] =Board.bitboard_array_global[GenConst.BR].and(MoveConstants.SQUARE_BBS[GenConst.A8].not()); + + Board.castle_rights_global[BKS_CASTLE_RIGHTS] = false; + Board.castle_rights_global[BQS_CASTLE_RIGHTS] = false; + Board.ep = NO_SQUARE; + break; + + case GenConst.TAG_BKnightPromotion: //BNPr + Board.bitboard_array_global[GenConst.BN] =Board.bitboard_array_global[GenConst.BN].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + break; + case GenConst.TAG_BBishopPromotion: //BBPr + Board.bitboard_array_global[GenConst.BB] =Board.bitboard_array_global[GenConst.BB].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + break; + case GenConst.TAG_BQueenPromotion: //BQPr + Board.bitboard_array_global[GenConst.BQ] =Board.bitboard_array_global[GenConst.BQ].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + break; + case GenConst.TAG_BRookPromotion: //BRPr + Board.bitboard_array_global[GenConst.BR] =Board.bitboard_array_global[GenConst.BR].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + break; + case 12: //WNPr + Board.bitboard_array_global[GenConst.WN] =Board.bitboard_array_global[GenConst.WN].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + break; + case 13: //WBPr + Board.bitboard_array_global[GenConst.WB] =Board.bitboard_array_global[GenConst.WB].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + break; + case 14: //WQPr + Board.bitboard_array_global[GenConst.WQ] =Board.bitboard_array_global[GenConst.WQ].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + break; + case 15: //WRPr + Board.bitboard_array_global[GenConst.WR] =Board.bitboard_array_global[GenConst.WR].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + break; + case 16: //BNPrCAP + Board.bitboard_array_global[GenConst.BN] =Board.bitboard_array_global[GenConst.BN].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + for (int i = GenConst.WP; i <= GenConst.WK; ++i) + { + if (isNotZero((Board.bitboard_array_global[i].and(MoveConstants.SQUARE_BBS[targetSquare])))) + { + captureIndex = i; + break; + } + } + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + + break; + case 17: //BBPrCAP + Board.bitboard_array_global[GenConst.BB] =Board.bitboard_array_global[GenConst.BB].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + for (int i = GenConst.WP; i <= GenConst.WK; ++i) + { + if (isNotZero((Board.bitboard_array_global[i].and(MoveConstants.SQUARE_BBS[targetSquare])))) + { + captureIndex = i; + break; + } + } + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + break; + case 18: //BQPrCAP + Board.bitboard_array_global[GenConst.BQ] =Board.bitboard_array_global[GenConst.BQ].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + for (int i = GenConst.WP; i <= GenConst.WK; ++i) + { + if (isNotZero((Board.bitboard_array_global[i].and(MoveConstants.SQUARE_BBS[targetSquare])))) + { + captureIndex = i; + break; + } + } + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + break; + case 19: //BRPrCAP + Board.bitboard_array_global[GenConst.BR] =Board.bitboard_array_global[GenConst.BR].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + for (int i = GenConst.WP; i <= GenConst.WK; ++i) + { + if (isNotZero((Board.bitboard_array_global[i].and(MoveConstants.SQUARE_BBS[targetSquare])))) + { + captureIndex = i; + break; + } + } + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + break; + case 20: //WNPrCAP + Board.bitboard_array_global[GenConst.WN] =Board.bitboard_array_global[GenConst.WN].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + for (int i = GenConst.BP; i <= GenConst.BK; ++i) + { + if (isNotZero((Board.bitboard_array_global[i].and(MoveConstants.SQUARE_BBS[targetSquare])))) + { + captureIndex = i; + break; + } + } + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + + break; + case 21: //WBPrCAP + Board.bitboard_array_global[GenConst.WB] =Board.bitboard_array_global[GenConst.WB].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + for (int i = GenConst.BP; i <= GenConst.BK; ++i) + { + if (isNotZero((Board.bitboard_array_global[i].and(MoveConstants.SQUARE_BBS[targetSquare])))) + { + captureIndex = i; + break; + } + } + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + + break; + case 22: //WQPrCAP + Board.bitboard_array_global[GenConst.WQ] =Board.bitboard_array_global[GenConst.WQ].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = NO_SQUARE; + for (int i = GenConst.BP; i <= GenConst.BK; ++i) + { + if (isNotZero((Board.bitboard_array_global[i].and(MoveConstants.SQUARE_BBS[targetSquare])))) + { + captureIndex = i; + break; + } + } + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + + break; + case 23: //WRPrCAP + Board.bitboard_array_global[GenConst.WR] =Board.bitboard_array_global[GenConst.WR].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + + Board.ep = NO_SQUARE; + for (int i = GenConst.BP; i <= GenConst.BK; i++) + { + if (isNotZero((Board.bitboard_array_global[i].and(MoveConstants.SQUARE_BBS[targetSquare])))) + { + captureIndex = i; + break; + } + } + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + break; + case 24: //WDouble + Board.bitboard_array_global[GenConst.WP] =Board.bitboard_array_global[GenConst.WP].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[GenConst.WP] =Board.bitboard_array_global[GenConst.WP].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = targetSquare + 8; + break; + case 25: //BDouble + Board.bitboard_array_global[GenConst.BP] =Board.bitboard_array_global[GenConst.BP].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[GenConst.BP] =Board.bitboard_array_global[GenConst.BP].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + Board.ep = targetSquare - 8; + break; + } + + if (piece == GenConst.WK) + { + Board.castle_rights_global[WKS_CASTLE_RIGHTS] = false; + Board.castle_rights_global[WQS_CASTLE_RIGHTS] = false; + } + else if (piece == GenConst.BK) + { + Board.castle_rights_global[BKS_CASTLE_RIGHTS] = false; + Board.castle_rights_global[BQS_CASTLE_RIGHTS] = false; + } + else if (piece == GenConst.WR) + { + if (Board.castle_rights_global[WKS_CASTLE_RIGHTS] == true) + { + if (isZero((Board.bitboard_array_global[GenConst.WR].and(MoveConstants.SQUARE_BBS[GenConst.H1])))) + { + Board.castle_rights_global[WKS_CASTLE_RIGHTS] = false; + } + } + if (Board.castle_rights_global[WQS_CASTLE_RIGHTS] == true) + { + if (isZero((Board.bitboard_array_global[GenConst.WR].and(MoveConstants.SQUARE_BBS[GenConst.A1])))) + { + Board.castle_rights_global[WQS_CASTLE_RIGHTS] = false; + } + } + } + else if (piece == GenConst.BR) + { + if (Board.castle_rights_global[BKS_CASTLE_RIGHTS] == true) + { + if (isZero((Board.bitboard_array_global[GenConst.BR].and(MoveConstants.SQUARE_BBS[GenConst.H8])))) + { + Board.castle_rights_global[BKS_CASTLE_RIGHTS] = false; + } + } + if (Board.castle_rights_global[BQS_CASTLE_RIGHTS] == true) + { + if (isZero((Board.bitboard_array_global[GenConst.BR].and(MoveConstants.SQUARE_BBS[GenConst.A8])))) + { + Board.castle_rights_global[BQS_CASTLE_RIGHTS] = false; + } + } + } + + priorNodes = nodes; + nodes += PerftInlineGlobal(depth - 1, ply + 1); + + Board.is_white_global = !Board.is_white_global; + switch (tag) + { + case GenConst.TAG_NONE: //none + case GenConst.TAG_CHECK: //check + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + break; + case GenConst.TAG_CAPTURE: //capture + case GenConst.TAG_CHECK_CAPTURE: //check cap + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + Board.bitboard_array_global[captureIndex] = Board.bitboard_array_global[captureIndex].or(MoveConstants.SQUARE_BBS[startingSquare]); + break; + case GenConst.TAG_WHITEEP: //white ep + //move piece + Board.bitboard_array_global[GenConst.WP] =Board.bitboard_array_global[GenConst.WP].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.WP] =Board.bitboard_array_global[GenConst.WP].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + Board.bitboard_array_global[GenConst.BP] =Board.bitboard_array_global[GenConst.BP].and(MoveConstants.SQUARE_BBS[targetSquare + 8]); + break; + case GenConst.TAG_BLACKEP: //black ep + Board.bitboard_array_global[GenConst.BP] =Board.bitboard_array_global[GenConst.BP].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.BP] =Board.bitboard_array_global[GenConst.BP].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + Board.bitboard_array_global[GenConst.WP] =Board.bitboard_array_global[GenConst.WP].or(MoveConstants.SQUARE_BBS[targetSquare - 8]); + break; + + case GenConst.TAG_WCASTLEKS: //WKS + //white king + Board.bitboard_array_global[GenConst.WK] =Board.bitboard_array_global[GenConst.WK].or(MoveConstants.SQUARE_BBS[GenConst.E1]); + Board.bitboard_array_global[GenConst.WK] =Board.bitboard_array_global[GenConst.WK].and(MoveConstants.SQUARE_BBS[GenConst.G1].not()); + Board.bitboard_array_global[GenConst.WR] =Board.bitboard_array_global[GenConst.WR].or(MoveConstants.SQUARE_BBS[GenConst.H1]); + Board.bitboard_array_global[GenConst.WR] =Board.bitboard_array_global[GenConst.WR].and(MoveConstants.SQUARE_BBS[GenConst.F1].not()); + break; + case GenConst.TAG_WCASTLEQS: //WQS + Board.bitboard_array_global[GenConst.WK] =Board.bitboard_array_global[GenConst.WK].or(MoveConstants.SQUARE_BBS[GenConst.E1]); + Board.bitboard_array_global[GenConst.WK] =Board.bitboard_array_global[GenConst.WK].and(MoveConstants.SQUARE_BBS[GenConst.C1].not()); + Board.bitboard_array_global[GenConst.WR] =Board.bitboard_array_global[GenConst.WR].or(MoveConstants.SQUARE_BBS[GenConst.A1]); + Board.bitboard_array_global[GenConst.WR] =Board.bitboard_array_global[GenConst.WR].and(MoveConstants.SQUARE_BBS[GenConst.D1].not()); + break; + case GenConst.TAG_BCASTLEKS: //BKS + Board.bitboard_array_global[GenConst.BK] =Board.bitboard_array_global[GenConst.BK].or(MoveConstants.SQUARE_BBS[GenConst.E8]); + Board.bitboard_array_global[GenConst.BK] =Board.bitboard_array_global[GenConst.BK].and(MoveConstants.SQUARE_BBS[GenConst.G8].not()); + Board.bitboard_array_global[GenConst.BR] =Board.bitboard_array_global[GenConst.BR].or(MoveConstants.SQUARE_BBS[GenConst.H8]); + Board.bitboard_array_global[GenConst.BR] =Board.bitboard_array_global[GenConst.BR].and(MoveConstants.SQUARE_BBS[GenConst.F8].not()); + break; + case GenConst.TAG_BCASTLEQS: //BQS + Board.bitboard_array_global[GenConst.BK] =Board.bitboard_array_global[GenConst.BK].or(MoveConstants.SQUARE_BBS[GenConst.E8]); + Board.bitboard_array_global[GenConst.BK] =Board.bitboard_array_global[GenConst.BK].and(MoveConstants.SQUARE_BBS[GenConst.C8].not()); + Board.bitboard_array_global[GenConst.BR] =Board.bitboard_array_global[GenConst.BR].or(MoveConstants.SQUARE_BBS[GenConst.A8]); + Board.bitboard_array_global[GenConst.BR] =Board.bitboard_array_global[GenConst.BR].and(MoveConstants.SQUARE_BBS[GenConst.D8].not()); + break; + + case GenConst.TAG_BKnightPromotion: //BNPr + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.BN] =Board.bitboard_array_global[GenConst.BN].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + break; + case GenConst.TAG_BBishopPromotion: //BBPr + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.BB] =Board.bitboard_array_global[GenConst.BB].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + break; + case GenConst.TAG_BQueenPromotion: //BQPr + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.BQ] =Board.bitboard_array_global[GenConst.BQ].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + Board.ep = NO_SQUARE; + break; + case GenConst.TAG_BRookPromotion: //BRPr + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.BR] =Board.bitboard_array_global[GenConst.BR].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + Board.ep = NO_SQUARE; + break; + case 12: //WNPr + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.WN] =Board.bitboard_array_global[GenConst.WN].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + break; + case 13: //WBPr + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.WB] =Board.bitboard_array_global[GenConst.WB].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + break; + case 14: //WQPr + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.WQ] =Board.bitboard_array_global[GenConst.WQ].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + break; + case 15: //WRPr + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.WR] =Board.bitboard_array_global[GenConst.WR].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + break; + case 16: //BNPrCAP + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.BN] =Board.bitboard_array_global[GenConst.BN].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].or(MoveConstants.SQUARE_BBS[targetSquare]); + break; + case 17: //BBPrCAP + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.BB] =Board.bitboard_array_global[GenConst.BB].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].or(MoveConstants.SQUARE_BBS[targetSquare]); + break; + case 18: //BQPrCAP + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.BQ] =Board.bitboard_array_global[GenConst.BQ].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].or(MoveConstants.SQUARE_BBS[targetSquare]); + break; + case 19: //BRPrCAP + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.BR] =Board.bitboard_array_global[GenConst.BR].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].or(MoveConstants.SQUARE_BBS[targetSquare]); + break; + case 20: //WNPrCAP + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.WN] =Board.bitboard_array_global[GenConst.WN].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].or(MoveConstants.SQUARE_BBS[targetSquare]); + break; + case 21: //WBPrCAP + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.WB] =Board.bitboard_array_global[GenConst.WB].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].or(MoveConstants.SQUARE_BBS[targetSquare]); + break; + case 22: //WQPrCAP + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.WQ] =Board.bitboard_array_global[GenConst.WQ].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].or(MoveConstants.SQUARE_BBS[targetSquare]); + break; + case 23: //WRPrCAP + Board.bitboard_array_global[piece] =Board.bitboard_array_global[piece].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.WR] =Board.bitboard_array_global[GenConst.WR].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + Board.bitboard_array_global[captureIndex] =Board.bitboard_array_global[captureIndex].or(MoveConstants.SQUARE_BBS[targetSquare]); + break; + case 24: //WDouble + Board.bitboard_array_global[GenConst.WP] =Board.bitboard_array_global[GenConst.WP].or(MoveConstants.SQUARE_BBS[startingSquare]); + Board.bitboard_array_global[GenConst.WP] =Board.bitboard_array_global[GenConst.WP].and(MoveConstants.SQUARE_BBS[targetSquare].not()); + break; + case 25: //BDouble + Board.bitboard_array_global[GenConst.BP] =Board.bitboard_array_global[GenConst.BP].or(MoveConstants.SQUARE_BBS[targetSquare]); + Board.bitboard_array_global[GenConst.BP] =Board.bitboard_array_global[GenConst.BP].and(MoveConstants.SQUARE_BBS[startingSquare].not()); + break; + } + + Board.castle_rights_global[0] = copy_castle[0]; + Board.castle_rights_global[1] = copy_castle[1]; + Board.castle_rights_global[2] = copy_castle[2]; + Board.castle_rights_global[3] = copy_castle[3]; + Board.ep = copyEp; + + //if (epGlobal != NO_SQUARE) + //{ + // std::cout << " ep: " << SQ_CHAR_X[epGlobal] << SQ_CHAR_Y[epGlobal] << '\n'; + //} + + + + if (ply == 0) + { + //Pr.printInt(startingSquare); + //Pr.printInt(targetSquare); + //Pr.printInt(tag); + PrintMoveNoNL(startingSquare, targetSquare, tag); + System.out.printf(": %d\n", nodes - priorNodes); + } + } + + return nodes; + } + + public static void RunPerftInlineGlobalOcc(int depth) + { + long startTime = System.currentTimeMillis(); + + int nodes = PerftInlineDebug(depth, 0); + + long endTime = System.currentTimeMillis(); + + long elapsedTime = endTime - startTime; + + String nodeString = String.format("Nodes: %d\n", nodes); + String timeString = String.format("Time taken: %d ms\n", elapsedTime); + + Pr.print(nodeString); + Pr.print(timeString); + } +} diff --git a/Java/Pr.java b/Java/Pr.java new file mode 100644 index 0000000..6fdb393 --- /dev/null +++ b/Java/Pr.java @@ -0,0 +1,39 @@ +import java.math.BigInteger; + +public class Pr { + + public static void print(String input) + { + System.out.print(input); + } + public static void println(String input) + { + System.out.println(input); + } + public static void printInt(int input) + { + System.out.print(input); + } + public static void printIntLn(int input) + { + System.out.println(input); + } + public static void printBigInteger(BigInteger input) + { + System.out.print(input); + } + public static void printBigIntegerLn(BigInteger input) + { + System.out.println(input); + } + + + + public static void printSquareLn(int input) + { + assert input >= 0 && input < 64 : "Invalid square: " + input; + + System.out.print(GenConst.SQ_CHAR_X[input]); + System.out.println(GenConst.SQ_CHAR_Y[input]); + } +} diff --git a/Java/Testing.java b/Java/Testing.java new file mode 100644 index 0000000..0b7d001 --- /dev/null +++ b/Java/Testing.java @@ -0,0 +1,72 @@ +import java.math.BigInteger; + +public class Testing +{ + + public static void testRookMoves() + { + int rookSquare = 36; + + BigInteger WP_STARTING_POSITIONS = new BigInteger("71776119061217280"); + BigInteger BP_STARTING_POSITIONS = new BigInteger("65280"); + BigInteger COMBINED_OCC = WP_STARTING_POSITIONS.or(BP_STARTING_POSITIONS); + + BigInteger rookMoves = MoveUtils.GetRookMovesSeparate(COMBINED_OCC, rookSquare); + Bitboard.printBigInteger(rookMoves); + } + + public static void TestKnightMoves() + { + BigInteger MAX_BIGINT = new BigInteger("18446744073709551615"); // Max u64 value + BigInteger knightBitboard = BigInteger.ZERO; + knightBitboard = knightBitboard.setBit(45); + knightBitboard = knightBitboard.setBit(42); + + Bitboard.printBigInteger(knightBitboard); + Bitboard.printBigInteger(MAX_BIGINT); + + BigInteger tempBitboard = knightBitboard; + + while (!tempBitboard.equals(BigInteger.ZERO)) + { + int knightSquare = Bitboard.bitScanForwardSlow(tempBitboard); + tempBitboard = tempBitboard.clearBit(knightSquare); + + Pr.println("Knight square: " + knightSquare); + + if (knightSquare == -1) + { + Pr.println("Error knight sq -1"); + break; + } + + BigInteger knightAttacks = MoveConstants.KNIGHT_ATTACKS[knightSquare]; + Pr.println("Knight on square " + knightSquare); + Bitboard.printBigInteger(knightAttacks); + } + } + + public static void printRookMoves() + { + for (int direction = 0; direction < 4; direction++) + { + Pr.println("direction: " + direction); + for (int sq = 0; sq < 64; sq++) + { + Bitboard.printBigInteger(MoveConstants.ROOK_ATTACKS[direction][sq]); + } + } + } + + public static void printBishopMoves() + { + for (int direction = 0; direction < 4; direction++) + { + Pr.println("direction: " + direction); + for (int sq = 0; sq < 64; sq++) + { + Bitboard.printBigInteger(MoveConstants.BISHOP_ATTACKS[direction][sq]); + } + } + } +}