OFFSET
0,3
COMMENTS
Let the "permutation set" of a positive integer n be the set of all integers formed by permuting the digits of n. Two integers are "permutationally congruent" if they generate the same permutation set. A "permutation class" is a set of all permutationally congruent integers. This sequence lists each permutation class, identified by its smallest member.
These are also the positive integers in order, omitting any d-digit number n if a previously listed d-digit number is a permutation of the digits of n.
Range of A328447: smallest representative of the equivalence class of all numbers having the same digits up to permutation. Equivalently: Numbers with digits in nondecreasing order, except that the smallest nonzero digit must precede the zero digits. This sequence is useful when considering functions which depend only on the digits of n, e.g., the number of primes contained in n, cf. A039993, A039999, A075053 and the records therein, A072857 (primeval numbers) and A076497, resp. A239196 and A239197, etc. - M. F. Hasler, Oct 18 2019
LINKS
Aaron Dunigan AtLee and Michael De Vlieger, Table of n, a(n) for n = 0..10000 (first 2997 terms from Aaron Dunigan AtLee; prefix 0 by Georg Fischer, Oct 24 2019)
EXAMPLE
The permutation set of 24 is {24, 42}, and this is the equivalence class modulo permutations of both of them, so 24 is listed, but 42 is not.
The permutation set of 30 is {3, 30}, but 3 is not in the same permutation class as 30 since 30 cannot be obtained by permuting digits of 3. Therefore 30 is listed separately from 3.
The numbers 89 and 98 are also permutationally congruent and form a permutation class, so only the smaller one is listed.
MATHEMATICA
maxTerm = 103; (*maxTerm is the greatest term you wish to see*) permutationSet[n_Integer] := FromDigits /@ Permutations[IntegerDigits[n]]; permutationCongruentQ[x_Integer, y_Integer] := Sort[permutationSet[x]] == Sort[permutationSet[y]]; DeleteDuplicates[Range[maxTerm], permutationCongruentQ]
f[n_] := Block[{a = {0}, b = {DigitCount[0]}, i, w}, Do[w = DigitCount@ i; AppendTo[b, w]; If[! MemberQ[Most@ b, w], AppendTo[a, i]], {i, n}]; Rest@ a]; f@ 103 (* or faster: *)
Select[Range@ 103, LessEqual @@ IntegerDigits@ # || And[Take[IntegerDigits@ #, Last@ DigitCount@ # + 1] == Reverse@ Take[Sort@ IntegerDigits@ #, Last@ DigitCount@ # + 1], LessEqual @@ DeleteCases[IntegerDigits@ #, d_ /; d == 0]] &] (* Michael De Vlieger, Jul 14 2015 *)
PROG
(PARI) is(n) = {my(d=digits(n), i); for(i=2, #d, if(d[i]!=0, d=vecextract(d, concat([1], vector(#d-i+1, j, i-1+j))); break)); d==vecsort(d)||n/10^valuation(n, 10)<10}
\\given an element n, in base b, find the next element from the sequence.
nxt(n, {b=10}) = {my(d = digits(n)); i = #d; while(i>0&&d[i]==b-1, i--); if(i>1, if(d[i]>0, d[i]++, d[i]=d[1]; ); for(j=i+1, #d, d[j]=d[i]), if(i==1, d[i]++; for(j=2, #d, d[j]=0), return(10^(#d)))); sum(j=1, #d, d[j]*10^(#d-j))} \\ David A. Corneth, Apr 23 2016
(Python)
from itertools import count, chain, islice
from sympy.utilities.iterables import combinations_with_replacement
def A179239_gen(): # generator of terms
return chain((0, ), (int(a+''.join(b)) for l in count(1) for a in '123456789' for b in combinations_with_replacement('0'+''.join(str(d) for d in range(int(a), 10)), l-1)))
CROSSREFS
A variant of A009994.
KEYWORD
nonn,base
AUTHOR
Aaron Dunigan AtLee, Jul 04 2010
EXTENSIONS
Prefixed with a(0) = 0 by M. F. Hasler, Oct 18 2019
STATUS
approved