A217043
a(1) = 1; a(n+1) is the smallest integer >=0 that cannot be obtained from the integers {a(1), ..., a(n)} using each number at most once and the operators +, -, *, / and accepting fractional intermediate results.
Original entry on oeis.org
1, 2, 4, 11, 34, 152, 1143, 8285, 98863, 657309
Offset: 1
a(4)=11 because we can write 4+1=5, 4+2=6, 4+2+1=7, 4*2=8, 4*2+1=9, (4+1)*2=10 by using 1, 2 and 4, but we cannot construct 11 this way.
a(7)=1143 because 1142 = (152+((34-4)*(11*(2+1)))), and 1143 is impossible.
a(7) is not 1007 because it can be constructed as 1007 = 152*(11-(34+1)/(4*2)); the fractional intermediate result 35/8, for example, is accepted in the composition.
-
from fractions import Fraction
def a(n, v):
R = dict() # index of each reachable subset is [card(s)-1][s]
for i in range(n): R[i] = dict()
for i in range(n): R[0][(v[i],)] = {v[i]}
reach = set(v)
for j in range(1, n):
for i in range((j+1)//2):
for s1 in R[i]:
for s2 in R[j-1-i]:
if set(s1) & set(s2) == set():
s12 = tuple(sorted(set(s1) | set(s2)))
if s12 not in R[len(s12)-1]:
R[len(s12)-1][s12] = set()
for a in R[i][s1]:
for b in R[j-1-i][s2]:
allowed = [a+b, a*b, a-b, b-a]
if a != 0: allowed.append(Fraction(b, a))
if b != 0: allowed.append(Fraction(a, b))
R[len(s12)-1][s12].update(allowed)
reach.update(allowed)
k = 1
while k in reach: k += 1
return k
alst = [1]
[alst.append(a(n, alst)) for n in range(1, 6)]
print(alst) # Michael S. Branicky, Jul 01 2022
A357891
a(1) = 1; a(n+1) is the smallest integer > 0 that cannot be obtained from the integers {a(1), ..., a(n)} using each number exactly once and the operators +, -, *, /.
Original entry on oeis.org
1, 2, 4, 11, 34, 152, 1079, 6610, 93221
Offset: 1
-
from fractions import Fraction
def a(n, v):
R = dict() # index of each reachable subset is [card(s)-1][s]
for i in range(n): R[i] = dict()
for i in range(n): R[0][(v[i], )] = {v[i]}
#reach = set(v)
for j in range(1, n):
for i in range((j+1)//2):
for s1 in R[i]:
for s2 in R[j-1-i]:
if set(s1) & set(s2) == set():
s12 = tuple(sorted(set(s1) | set(s2)))
if s12 not in R[len(s12)-1]:
R[len(s12)-1][s12] = set()
for a in R[i][s1]:
for b in R[j-1-i][s2]:
allowed = [a+b, a*b, a-b, b-a]
if a!=0: allowed.append(Fraction(b, a))
if b!=0: allowed.append(Fraction(a, b))
R[len(s12)-1][s12].update(allowed)
k = 1
while k in R[n-1][tuple(v)]: k += 1
return k
alst = [1]
[alst.append(a(n, alst)) for n in range(1, 6)]
print(alst) # Michael S. Branicky, Nov 01 2022
A358075
a(1) = 1; a(n+1) is the smallest integer > 0 that cannot be obtained from the integers {a(1), ..., a(n)} using each number exactly once and the operators +, -, *, /, where intermediate subexpressions must be integers.
Original entry on oeis.org
1, 2, 4, 11, 34, 152, 1007, 6703, 56837, 766478
Offset: 1
All positive numbers up to 151 can be computed from the first 5 terms 1, 2, 4, 11, 34; e.g., 105 = (1 + 4) * (34 - 11 - 2). All terms are used, and each term is used only once.
There is no such formula for 152, so a(6) = 152.
-
restart: with(combinat):
# generate numbers from set s
GEN := proc(s) option remember;
local erg,X,Y,x,y,i,a,b;
if nops(s) < 2 then
return s;
fi;
erg := {};
for i to nops(s)/2 do
for a in choose(s,i) do
b := s minus a;
X := procname(a);
Y := procname(b);
for x in X do
for y in Y do
erg := erg union {x+y};
if x < y then
erg := erg union {y-x};
elif x > y then
erg := erg union {x-y};
fi;
erg := erg union {x*y};
if type(x/y,integer) then
erg := erg union {x/y};
elif type(y/x,integer) then
erg := erg union {y/x};
fi;
od;
od;
od;
od;
return erg;
end:
# minimal excluded number (not in set s)
MEX := proc(s)
local i;
for i to infinity do
if not member(i,s) then
return i;
fi;
od;
end:
MaxIndex := 8;
a := array(1..MaxIndex):
w := {}:
for n to MaxIndex do
a[n] := MEX(GEN(w));
w := w union {a[n]};
od:
seq(a[n],n=1..MaxIndex);
-
def a(n, v):
R = dict() # index of each reachable subset is [card(s)-1][s]
for i in range(n): R[i] = dict()
for i in range(n): R[0][(v[i], )] = {v[i]}
for j in range(1, n):
for i in range((j+1)//2):
for s1 in R[i]:
for s2 in R[j-1-i]:
if set(s1) & set(s2) == set():
s12 = tuple(sorted(set(s1) | set(s2)))
if s12 not in R[len(s12)-1]:
R[len(s12)-1][s12] = set()
for a in R[i][s1]:
for b in R[j-1-i][s2]:
allowed = [a+b, a*b, a-b, b-a]
if a!=0 and b%a==0: allowed.append(b//a)
if b!=0 and a%b==0: allowed.append(a//b)
R[len(s12)-1][s12].update(allowed)
k = 1
while k in R[n-1][tuple(v)]: k += 1
return k
alst = [1]
[alst.append(a(n, alst)) for n in range(1, 8)]
print(alst) # Michael S. Branicky, Oct 30 2022
Showing 1-3 of 3 results.
Comments