base_10_square_pattern := proc(x) local z, A, alpha, m, numlist, t, j, y: z := x: A := [x]: while evalb(t in convert(A[1..- 2], set)) = false do m := length(convert(z, string)): numlist := ListTools:-Reverse([seq(i, i = 1..m)]): t := 0: for j in numlist do y := floor(z/(10^(j - 1))): t := t + y^2: z := z - y*10^(j - 1): od: z := t: A := [op(A), t]: od: A end proc: base_n_square_pattern := proc(x, n) local y, A, alpha, newx, i: y := x: A := [x]: while evalb(y in convert(A[1..-2], set)) = false do newx := ListTools:-Reverse(convert(y, base, n)): for i to nops(newx) do newx[i] := newx[i]^2 od: y := sum(newx[j], j = 1..nops(newx)): A := [op(A), y] od: A end proc: number_of_square_patterns := proc(n) local k, m, d, A, l1, K, k1, l2, k2: k := 1: while k*(n - 1)^2 >= n^(k - 1) - 1 do k := k + 1: od: m := 0: d := k*(n - 1)^2: A := Array(1..d): if n = 10 then for l1 to d do A[l1] := convert(base_10_square_pattern(l1), set): K := {}: for k1 to l1 - 1 do K := K union (A[k1] intersect A[l1]): if K <> {} then break: fi: od: if K = {} then m := m + 1: fi: od: fi: if n <> 10 then for l2 to d do A[l2] := convert(base_n_square_pattern(l2, n), set): K := {}: for k2 to l2 - 1 do K := K union (A[k2] intersect A[l2]): if K <> {} then break: fi: od: if K = {} then m := m + 1: fi: od: fi: m end proc: