Given

```
obj::CircularArray{Bool,2,BitMatrix}
```

that has undergone a combination of linear transformations

`circshift(A::AbstractMatrix, shifts::NTuple{2,<:Integer})`

`rotl90(A::AbstractMatrix, k::Integer)`

`reverse(A::AbstractMatrix; dims::Integer)`

`permutedims(m::AbstractMatrix)`

how can I recover the inverse of linear transformations?

For example,

```
a = [3, 4, 21, 22, 25, 26, 28, 29, 30, 45, 46, 47, 49, 53, 54, 71, 72, 75, 78, 97, 101, 102, 123, 124, 125, 126, 149, 150, 175, 550, 551, 574, 575, 576, 577, 598, 599, 600, 603, 622]
b = [11, 17, 37, 38, 39, 40, 41, 63, 64, 65, 89, 464, 488, 489, 490, 512, 513, 514, 515, 516, 536, 542, 560, 561, 564, 567, 568, 584, 585, 586, 588, 590, 592, 593, 594, 610, 611, 614, 617, 618]
A = reshape((1:25^2) .∈ Ref(a), 25, 25)
B = reshape((1:25^2) .∈ Ref(b), 25, 25)
```

Here is `A`

and `B`

Through inspecting the images I was able to find that `A`

can be obtained from `B`

through

```
findall(A) == findall(circshift(B, (11, 3)))
```

However, I am still missing the mathematical foundation to implement the following:

```
function magic(A::AbstractMatrix{<:Boo},
B::AbstractMatrix{<:Boo})
# Finds R ∋ B * R == A
end
```

```
trans = qd_rigid(A, B, (25, 25), 3π/2)[1]
```

Gives the `AffineMap`

I can use to recover the image!