docs: def return_periods(eff_time, num_losses):
      """
      :param eff_time: ses_per_logic_tree_path * investigation_time
      :param num_losses: used to determine the minimum period
      :returns: an array of 32 bit periods
  
      Here are a few examples:
  
      >>> return_periods(1, 1)
      Traceback (most recent call last):
         ...
      AssertionError: eff_time too small: 1
      >>> return_periods(2, 2)
      array([1, 2], dtype=uint32)
      >>> return_periods(2, 10)
      array([1, 2], dtype=uint32)
      >>> return_periods(100, 2)
      array([ 50, 100], dtype=uint32)
      >>> return_periods(1000, 1000)
      array([   1,    2,    5,   10,   20,   50,  100,  200,  500, 1000],
            dtype=uint32)
      """
      assert eff_time >= 2, 'eff_time too small: %s' % eff_time
      assert num_losses >= 2, 'num_losses too small: %s' % num_losses
      min_time = eff_time / num_losses
      period = 1
      periods = []
      loop = True
      while loop:
          for val in [1, 2, 5]:
              time = period * val
              if time >= min_time:
                  if time > eff_time:
                      loop = False
                      break
                  periods.append(time)
          period *= 10
      return U32(periods)