private unsafe bool LoopComp() { report.ChangeProgressVisibilitySafe(false); var cartesian = CartesianProduct.Create(Enumerable.Repeat(Enumerable.Range(0, 58), missCount)); using Sha256Fo sha = new Sha256Fo(); bool success = false; uint[] temp = new uint[precomputed.Length]; fixed(uint *hPt = &sha.hashState[0], wPt = &sha.w[0]) fixed(uint *pow = &powers58[0], res = &precomputed[0], tmp = &temp[0]) fixed(int *mi = &missingIndexes[0]) { foreach (var item in cartesian) { Buffer.MemoryCopy(res, tmp, 40, 40); int mis = 0; foreach (var keyItem in item) { ulong carry = 0; for (int k = 9, j = 0; k >= 0; k--, j++) { ulong result = (pow[(mi[mis] * 10) + j] * (ulong)keyItem) + tmp[k] + carry; tmp[k] = (uint)result; carry = (uint)(result >> 32); } mis++; } wPt[0] = (tmp[0] << 16) | (tmp[1] >> 16); wPt[1] = (tmp[1] << 16) | (tmp[2] >> 16); wPt[2] = (tmp[2] << 16) | (tmp[3] >> 16); wPt[3] = (tmp[3] << 16) | (tmp[4] >> 16); wPt[4] = (tmp[4] << 16) | (tmp[5] >> 16); wPt[5] = (tmp[5] << 16) | (tmp[6] >> 16); wPt[6] = (tmp[6] << 16) | (tmp[7] >> 16); wPt[7] = (tmp[7] << 16) | (tmp[8] >> 16); wPt[8] = (tmp[8] << 16) | 0b00000000_00000000_10000000_00000000U; // from 9 to 14 =0 wPt[15] = 272; // 34 *8 = 272 sha.Init(hPt); sha.CompressDouble34(hPt, wPt); if (hPt[0] == tmp[9]) { SetResult(item); success = true; } } } return(success); }