···2424 return true;
2525}
26262727-// TODO: (fix): When is_costas receives a non-const qualified vector it may
2828-// return an incorrect result.
2927fn is_costas(Vec<UInt> const& vec) -> Bool {
3028 using Set = std::unordered_set<UInt>;
31293230 if (Set(vec.cbegin(), vec.cend()).size() != vec.size())
3331 return false;
34323535- bool flag = false;
3636- auto const l = vec.size() / 2 + 2;
3737-#pragma omp parallel for shared(flag)
3838- for (Size h = 1; h < l; ++h) {
3333+ let n = vec.size();
3434+ var flag = false;
3535+ for (Size k = 1; k < n; ++k) {
3936 if (flag)
4040- continue;
4141- var set = Set(l - h);
4242- for (Size i = h - 1; i < l - 1; ++i) {
4343- let result = vec[(h + i) % l] - vec[i];
4444- if (set.contains(result)) {
4545-#pragma omp atomic write
3737+ break;
3838+ var seen = Vec<Bool>(2 * n, false);
3939+ for (Size i = 0; i < n - k; ++i) {
4040+ let result = Int(vec[(i + k) % n]) - Int(vec[i]) + Int(n);
4141+ if (not seen[result]) {
4642 flag = true;
4743 break;
4844 }
4949- set.insert(vec[(h + i) % l] - vec[i]);
5045 }
5146 }
5252- return !flag;
4747+ return flag;
5348}
54495550fn costas_nxn(Vec<UInt> v) -> Vec<Vec<UInt>> {