Brazilian numbers are so called as they were first formally presented at the 1994 math Olympiad Olimpiada Iberoamericana de Matematica in Fortaleza, Brazil.

Brazilian numbers are defined as:

The set of positive integer numbers where each number N has at least one natural number B where 1 < B < N-1 where the representation of N in base B has all equal digits.



E.G.

 1, 2 & 3 can not be Brazilian; there is no base B that satisfies the condition 1 < B < N-1.
 4 is not Brazilian; 4 in base 2 is 100. The digits are not all the same.
 5 is not Brazilian; 5 in base 2 is 101, in base 3 is 12. There is no representation where the digits are the same.
 6 is not Brazilian; 6 in base 2 is 110, in base 3 is 20, in base 4 is 12. There is no representation where the digits are the same.
 7 is Brazilian; 7 in base 2 is 111. There is at least one representation where the digits are all the same.
 8 is Brazilian; 8 in base 3 is 22. There is at least one representation where the digits are all the same.
 and so on...


All even integers 2P >= 8 are Brazilian because 2P = 2(P-1) + 2, which is 22 in base P-1 when P-1 > 2. That becomes true when P >= 4.

More common: for all all integers R and S, where R > 1 and also S-1 > R, then R*S is Brazilian because R*S = R(S-1) + R, which is RR in base S-1

The only problematic numbers are squares of primes, where R = S. Only 11^2 is brazilian to base 3.

All prime integers, that are brazilian, can only have the digit 1. Otherwise one could factor out the digit, therefore it cannot be a prime number. Mostly in form of 111 to base Integer(sqrt(prime number)). Must be an odd count of 1 to stay odd like primes > 2


Task

Write a routine (function, whatever) to determine if a number is Brazilian and use the routine to show here, on this page;

 the first 20 Brazilian numbers;
 the first 20 odd Brazilian numbers;
 the first 20 prime Brazilian numbers;


See also

 OEIS:A125134 - Brazilian numbers
 OEIS:A257521 - Odd Brazilian numbers
 OEIS:A085104 - Prime Brazilian numbers


proc isPrime(n: Positive): bool =
  ## Check if a number is prime.
  if n mod 2 == 0:
    return n == 2
  if n mod 3 == 0:
    return n == 3
  var d = 5
  while d * d <= n:
    if n mod d == 0:
      return false
    if n mod (d + 2) == 0:
      return false
    inc d, 6
  result = true
 
proc sameDigits(n, b: Positive): bool =
  ## Check if the digits of "n" in base "b" are all the same.
  var d = n mod b
  var n = n div b
  if d == 0:
    return false
  while n > 0:
    if n mod b != d:
      return false
    n = n div b
  result = true
 
proc isBrazilian(n: Positive): bool =
  ## Check if a number is brazilian.
  if n < 7:
    return false
  if (n and 1) == 0:
    return true
  for b in 2..(n - 2):
    if sameDigits(n, b):
      return true
 
#———————————————————————————————————————————————————————————————————————————————————————————————————
 
when isMainModule:
  import strutils
 
  template printList(title: string; findNextToCheck: untyped) =
    ## Template to print a list of brazilians numbers.
    ## "findNextTocheck" is a list of instructions to find the
    ## next candidate starting for the current one "n".
 
    block:
      echo '\n' & title
      var n {.inject.} = 7
      var list: seq[int]
      while true:
        if n.isBrazilian():
          list.add(n)
          if list.len == 20: break
        findNextToCheck
      echo list.join(", ")
 
 
  printList("First 20 Brazilian numbers:"):
    inc n
 
  printList("First 20 odd Brazilian numbers:"):
    inc n, 2
 
  printList("First 20 prime Brazilian numbers:"):
    inc n, 2
    while not n.isPrime():
      inc n, 2