Predavanja: generiranje nalog

Besedilna naloga

Obravnavajmo naslednjo nalogo:

“Mama je stara 3 krat toliko kot sin, čez 18 let pa bo stara le še 2 toliko. Koliko sta stara mama in sin?”

Sestavimo funkcijo mamaSin[], ki izpiše inačico naloge z drugimi števili. Seveda morajo biti števila smiselna.

Solve[{k*sin==mama, (k-1)*(sin+leta)==mama+leta},{sin,mama}]

ClearAll[letaBeseda]
letaBeseda[1]:="leto"
letaBeseda[2]:="leti"
letaBeseda[3]:="leta"
letaBeseda[4]:="leta"
letaBeseda[n_]:="let"

ClearAll[mamaSin]
mamaSin[]:=
Module[{sin,mama,k,leta},
Until[18<mama-sin<45∧1<=sin∧mama+k<100,
k=RandomInteger[{3,20}];
leta=RandomInteger[{1,50}];
sin=(k-2)*leta;
mama=k*sin
];
StringForm["Mama je stara `1` krat toliko kot sin, čez `2` `6` pa bo stara le še `3` krat toliko. Koliko sta stara mama in sin? (Rešitev: mama = `4`, sin = `5`)",
k, leta, k-1, mama, sin, letaBeseda[Mod[leta,100]]]
]

Table[mamaSin[],{30}]//ColumnForm

Rešitev

ClearAll[mamaSin]
mamaSin[]:=
Module[
{sin,mama,n,k},
Until[mama+k<100∧18<mama-sin<40,
n=RandomInteger[{3,10}];
k=RandomInteger[{5,40}];
sin=k*(n-2);
mama=sin*n;
];
StringForm["Mama je stara `1` krat toliko kot sin, čez `2` let pa bo stara le še `3` toliko. Koliko sta stara mama in sin? (Odgovor: mama `4`, sin `5`)",
n,k , (n-1), mama, sin
 ]
]

Table[mamaSin[],{10}]//ColumnForm

Generiranje polinomov

Plus@@Table[RandomInteger[{-5,5}]*(x^i),{i,0,4}]+RandomInteger[{1,5}]*RandomChoice[{-1,1}]*(x^5)

Plus[1,2,3,5]

HoldForm[2+3+5]//FullForm

Kako generiramo polinom dane stopnje

FromDigits[{1,1,2},3]

FromDigits[{4,2,0,2},10]

Expand[FromDigits[{3,2,0,-2},x]]

ClearAll[polinom1]
polinom1[n_,x_]:=Expand[FromDigits[RandomInteger[{-9,9},{n}],x]]

Table[polinom1[5,x],{10}]//ColumnForm

ClearAll[polinom2]
polinom2[n_,x_]:=Module[{i},Plus@@Table[RandomInteger[{-9,9}]*(x^i),{i,0,n-1}]]+RandomInteger[{1,9}]*(x^n)

Table[polinom2[5,x],{10}]//ColumnForm

TeXForm[3 x + (x^2)+ 1]

StandardForm[3*x+(x^2)+1]

TraditionalForm[3*x+(x^2)+1]

TeXForm[(((x^2)+(x^3))/(3*x+(x^4)+1))]

Generiranje racionalnih števil

ClearAll[randomUlomek]
randomUlomek[a_,b_]:=RandomInteger[{-a,a}]/RandomInteger[{1,b}]

Table[randomUlomek[10,10], {10}]

Expand[Times@@Table[x-randomUlomek[10,4],{4}]]

Denominator[1/3]

Denominator[14]

LCM[{x,y,z}]

LCM@@{x,y,z}

LCM[1,4,3,8]

CoefficientList

ClearAll[lepeNicle]
lepeNicle[n_,x_]:=Module[{nicle, v,p},
nicle=Table[randomUlomek[10,4],{n}];
p=Times@@(x-nicle);
v=LCM@@(Denominator/@CoefficientList[p,x]);
{Expand[v*p],nicle}
]

Table[lepeNicle[3,u],{10}]//ColumnForm

Polinom z lepimi ničlami

ClearAll[polinom3]
polinom3[n_,x_]:=Expand[Times@@Table[x-RandomInteger[{-9,9}],{n}]]

Table[polinom3[3,x],{10}]//ColumnForm

Generiranje izrazov

ClearAll[x,y,z,izraz,izrazVar,izrazN,izrazPlus,izrazTimes]

izrazVar[n_]:=RandomChoice[{x}]

izrazN[n_]:=randomUlomek[10,10]

izrazPower[n_]:=
Module[{k},
ReplacePart[HoldForm[(1^1)],{{1,1}->izraz[n-1],{1,2}->RandomInteger[{2,5}]}]
]

izrazPlus[n_]:=
Module[{m},
m=RandomInteger[{1,n-2}];
ReplacePart[HoldForm[1+1],{{1,1}->izraz[m],{1,2}->izraz[n-m-1]}]
]

izrazTimes[n_]:=
Module[{m},
m=RandomInteger[{1,n-2}];
ReplacePart[HoldForm[1*1],{{1,1}->izraz[m],{1,2}->izraz[n-m-1]}]
]

izraz[n_]/;n<=1:=RandomChoice[{izrazVar,izrazN}][n]
izraz[n_]/;n>1:=RandomChoice[{izrazPlus,izrazPlus,izrazTimes,izrazPower}][n]

Function[e,{e,Simplify[ReleaseHold[e]]}]/@Table[izraz[6],{20}]//TableForm