# OK to post homework # James Betti, 2 Mar 2025, Assignment 10 SimulateNAND := proc(n,k,K) local total,_,P; total := 0; for _ to K do P := RSLP(n,k); total := total + nops(EvalSP(P,n)); od; total/K; end: SimulateNAND(10,5,1000); # 696.576 SimulateNAND(10,10,1000); # 661.712 SimulateNAND(10,20,1000); # 645.716 SimulateNAND(10,50,1000); # 635.187 Monotone := proc(n,k,p) local ra,P,i,i1,j1,gate; ra := rand(1..denom(p)); P := [seq(i,i=1..n)]; for i from n+1 to k+n do i1 := rand(1..nops(P)-1)(); j1 := rand(i1+1..nops(P))(); gate := OR; if ra() <= numer(p) then gate := AND; fi; P := [op(P),[i1,j1,gate]]; od; P; end: # Redefine `EvalSP1` to use OR/AND as needed for `SimulateMonotone`. EvalSP1 := proc(P,IN) local P1,n,i,i1,j1; P1 := IN; n := nops(IN); for i from n+1 to nops(P) do i1 := P[i][1]; j1 := P[i][2]; P1 := [op(P1),P[i][3](P1[i1],P1[j1])]; od; P1[-1]; end: SimulateMonotone := proc(n,k,p,K) local total,_,P; total := 0; for _ to K do P := Monotone(n,k,p); total := total + nops(EvalSP(P,n)); od; total/K; end: for k in {5,10,20,50} do for p in {1/2,3/4,1} do printf("SimulateMonotone(10,%d,%d/%d,1000):",k,numer(p),denom(p)); print(evalf(SimulateMonotone(10,k,p,1000))); od; od; # ====================RESULTS==================== # SimulateMonotone(10, 5,1/1,1000): 166.0800000 # SimulateMonotone(10, 5,1/2,1000): 506.8160000 # SimulateMonotone(10, 5,3/4,1000): 342.6240000 # SimulateMonotone(10,10,1/1,1000): 114.5720000 # SimulateMonotone(10,10,1/2,1000): 513.8160000 # SimulateMonotone(10,10,3/4,1000): 288.5680000 # SimulateMonotone(10,20,1/1,1000): 67.59000000 # SimulateMonotone(10,20,1/2,1000): 517.2260000 # SimulateMonotone(10,20,3/4,1000): 246.7590000 # SimulateMonotone(10,50,1/1,1000): 24.75800000 # SimulateMonotone(10,50,1/2,1000): 497.4980000 # SimulateMonotone(10,50,3/4,1000): 173.2520000