Permutation matrices research.

revert: Revert is_costas parallelization.

+9 -14
+9 -14
src/lib/lib.cpp
··· 24 24 return true; 25 25 } 26 26 27 - // TODO: (fix): When is_costas receives a non-const qualified vector it may 28 - // return an incorrect result. 29 27 fn is_costas(Vec<UInt> const& vec) -> Bool { 30 28 using Set = std::unordered_set<UInt>; 31 29 32 30 if (Set(vec.cbegin(), vec.cend()).size() != vec.size()) 33 31 return false; 34 32 35 - bool flag = false; 36 - auto const l = vec.size() / 2 + 2; 37 - #pragma omp parallel for shared(flag) 38 - for (Size h = 1; h < l; ++h) { 33 + let n = vec.size(); 34 + var flag = false; 35 + for (Size k = 1; k < n; ++k) { 39 36 if (flag) 40 - continue; 41 - var set = Set(l - h); 42 - for (Size i = h - 1; i < l - 1; ++i) { 43 - let result = vec[(h + i) % l] - vec[i]; 44 - if (set.contains(result)) { 45 - #pragma omp atomic write 37 + break; 38 + var seen = Vec<Bool>(2 * n, false); 39 + for (Size i = 0; i < n - k; ++i) { 40 + let result = Int(vec[(i + k) % n]) - Int(vec[i]) + Int(n); 41 + if (not seen[result]) { 46 42 flag = true; 47 43 break; 48 44 } 49 - set.insert(vec[(h + i) % l] - vec[i]); 50 45 } 51 46 } 52 - return !flag; 47 + return flag; 53 48 } 54 49 55 50 fn costas_nxn(Vec<UInt> v) -> Vec<Vec<UInt>> {