<?xml version="1.0" encoding="ISO-8859-1"?>
<mdoxml version="1.0"><br></br>
<span style="font-style: italic;">Tom -- Please edit xml with a new function for each problem type. You will need to alter the code of the function makeproblem() to pick up the new functions you put in. Please use the same notation var qa = [qString, aString];
return qa; so that I can slot into the main file easily.
version</span><br></br>
<br></br>
<form onchange="makeproblem()" action="#" name="qType"><select id="combo1">
<option value="0">Select a problem</option>
<option value="1">Partial Fractions</option>
<option value="2">Binomial Theorem</option>
<option value="3">Polynomial Integration</option>
<option value="4">Simple Trig Integration</option>
<option value="5">Vectors</option>
<option value="6">Lines in 3D</option>
<option value="7">Inequalities</option>
<option value="8">Arithmetic Progressions</option>
</select></form>

<br></br>
 

<script type="text/javascript"></script><script type="text/javascript" src="jsMath.js"></script><input type="button" value="New Problem" onclick="makeproblem()"></input> 

<div class="math" id="block1"></div><input type="button" value="Toggle Answer" onclick="showAnswer()"></input> 

<div style="display: none;" id="hidden">Here is the answer: <span id="inline1" class="math"></span><br></br>
</div>

<script type="text/javascript">
// gcd of any list of integers
function gcd() {
  var a=Math.abs(gcd.arguments[0]);
  var b=Math.abs(gcd.arguments[gcd.arguments.length-1]);
  for(var i=gcd.arguments.length;i&gt;2;i--) b=gcd(b,gcd.arguments[i-2]);
  while((a=a%b)&amp;&amp;(b=b%a));
  return a+b;
}

function reduceFrac(top,bot) {
  var i=0,j,k;
  var a=new Array(top.length);
  var b=new Array(bot.length);
  var c="";
  var agcd,bgcd;
  var num=RegExp(/[0-9]/);
  for(j=0;j&lt;Math.max(top.length,bot.length);j++) {
    a[j]=new Array("","","");
    b[j]=new Array("","","");
  }
  i=j=k=0;
  while(i&lt;top.length) {
    while(num.test(top.charAt(i))&amp;&amp;i&lt;top.length) a[j][0]=a[j][0].concat(top.charAt(i++));
    if(a[j][0]=="") a[j][0]=1;
    while(top.charAt(i)!="+"&amp;&amp;top.charAt(i)!="-"&amp;&amp;i&lt;top.length) a[j][1]=a[j][1].concat(top.charAt(i++));
    a[j++][2]=top.charAt(i++);
  }
  i=0;
  while(i&lt;bot.length) {
    while(num.test(bot.charAt(i))&amp;&amp;i&lt;bot.length) b[k][0]=b[k][0].concat(bot.charAt(i++));
    if(b[k][0]=="") b[k][0]=1;
    while(bot.charAt(i)!="+" &amp;&amp;bot.charAt(i)!="-"&amp;&amp;i&lt;bot.length) b[k][1]=b[k][1].concat(bot.charAt(i++));
    b[k++][2]=bot.charAt(i++);
  }
  agcd=a[0][0];
  for(l=0;l&lt;j;l++) if(agcd&gt;1) agcd=gcd(agcd,a[l][0]);
  if(agcd&gt;1) {
    bgcd=b[0][0];
    for(l=0;l&lt;k;l++) if(bgcd&gt;1) bgcd=gcd(bgcd,b[l][0]);
  }
  else bgcd=1;
  if((div=gcd(agcd,bgcd))&gt;1) {
    for(l=0;l&lt;=j;l++) a[l][0]/=div;
    for(l=0;l&lt;=k;l++) b[l][0]/=div;
  }
  for(l=0;l&lt;j;l++) if(a[l][0]==1&amp;&amp;a[l][1]!="") a[l][0]="";
  for(l=0;l&lt;k;l++) if(b[l][0]==1&amp;&amp;b[l][1]!="") b[l][0]="";
  ret="\\frac{";
  for(l=0;l&lt;j;l++) ret=ret.concat(a[l][0]+a[l][1]+a[l][2]);
  ret=ret.concat("}{");
  for(l=0;l&lt;k;l++) ret=ret.concat(b[l][0]+b[l][1]+b[l][2]);
  ret=ret.concat("}");
  return ret;
} 

// To make expressions look right. Not hugely reliable.
function tidy(txt) {
  var a;
  txt=txt.replace(/[+]-/g,"-");

  txt=txt.replace(/-[+]/g,"-");

  while(txt.search(/--/)!=-1) txt=txt.replace(/--/g,"+");

  while(txt.search(/[+][+]/)!=-1) txt=txt.replace(/[+][+]/g,"+");

  while((a=txt.search(/\w\^1/))!=-1) txt=txt.substring(0,a+1)+txt.substring(a+3);
 
  while((a=txt.search(/\w\^\{1\}/))!=-1) txt=txt.substring(0,a+1)+txt.substring(a+5);

  while((a=txt.search(/\D1[A-Z|a-z]/))!=-1) txt=txt.substring(0,a+1)+txt.substring(a+2);

  while((a=txt.search(/\D1\\[A-Z|a-z]/))!=-1) txt=txt.substring(0,a+1)+txt.substring(a+2);

  while((a=txt.search(/\D1\(/))!=-1) txt=txt.substring(0,a+1)+txt.substring(a+2);

  if(txt.search(/1[A-Z|a-z]/)==0) txt=txt.substring(1);

  if(txt.search(/1\\[A-Z|a-z]/)==0) txt=txt.substring(1);

  while((a=txt.search(/[+-]0/))!=-1 || (a=txt.search(/0/))==0)  {
    bra=0;
    do {
      txt=txt.substring(0,a)+txt.substring(a+1);
      if(txt.charAt(a)=="(") bra++;
      if(txt.charAt(a)==")") bra--;
    }
    while(txt.charAt(a)!="+"&amp;&amp;txt.charAt(a)!="-"&amp;&amp;bra&gt;=0&amp;&amp;a!=txt.length);
  }

  for(i=txt.length;i&gt;=0;i--) {
    if(txt.charAt(a=i)=="(") {
      bra=0;
      while(txt.charAt(++a)!=")") {
        if(txt.charAt(a)=="+" || txt.charAt(a)=="-") bra++;
      }
      if(bra==0) txt=txt.substring(0,i)+txt.substring(i+1,a)+txt.substring(a+1);
    }
  }

  var letter=RegExp(/[a-z|A-Z]/);
  var number=RegExp(/[0-9]/);

  for(i=0;i&lt;txt.length;i++) {
    if(txt.charAt(i)=="^"&amp;&amp;letter.test(txt.charAt(i-1))) {
      x=txt.charAt(i-1);
      pow=""; ins=""; i++;
      if(number.test(txt.charAt(i))) {
        pow=txt.charAt(i);
        for(j=0;j&lt;pow;j++) ins=ins.concat(x);
        txt=txt.substring(0,i-2)+ins+txt.substring(i+1);
      }
      else if(txt.charAt(j=i)=="{") {
        pow="";
        while(number.test(txt.charAt(++j))) pow=pow.concat(txt.charAt(j));
        if(txt.charAt(j)=="}") {
          for(k=0;k&lt;pow;k++) ins=ins.concat(x);
          txt=txt.substring(0,i-2)+ins+txt.substring(j+1);
        }
      }
    }
  }

  var flag=0;
  var inexpr=0;

  do {
    flag=inexpr=0;
    for(i=0;i&lt;txt.length;i++) {
      if(txt.charAt(i)=="\\") inexpr++;
      else if(inexpr==1&amp;&amp;!letter.test(txt.charAt(i))) inexpr--;
      else if(inexpr==0&amp;&amp;letter.test(txt.charAt(i))&amp;&amp;letter.test(txt.charAt(i+1))&amp;&amp;txt.charAt(i)&gt;txt.charAt(i+1)) {
        flag=1;
        txt=txt.substring(0,i)+txt.charAt(i+1)+txt.charAt(i)+txt.substring(i+2);
      }
    }
  }
  while(flag==1);  

  var twoletter=RegExp(/[A-z][A-z]/);
  for(i=0;i&lt;txt.length;i++) {
    if(letter.test(txt.charAt(a=i))) {
      while(txt.charAt(a)==txt.charAt(++a));
      if(a&gt;i+1) txt=txt.substring(0,i+1)+"^{"+(a-i)+"}"+txt.substring(a);
    }   
  }

  i=z=0;
  while((j=(txt.substring(i)).search("frac"))!=-1) {
    sendtop=sendbot="";
    k=(j+=i)+5;
    brace=1;
    while(brace!=0) {
      sendtop=sendtop.concat(txt.charAt(k));
      if(txt.charAt(k)=="{") brace++;
      if(txt.charAt(k)=="}") brace--;
      k++;
    }
    sendtop=sendtop.substring(0,sendtop.length-1);
    k++;
    brace=1;
    while(brace!=0) {
      sendbot=sendbot.concat(txt.charAt(k));
      if(txt.charAt(k)=="{") brace++;
      if(txt.charAt(k)=="}") brace--; 
      k++; 
    }
    sendbot=sendbot.substring(0,sendbot.length-1);
    backfrac=reduceFrac(sendtop,sendbot);
    txt=txt.substring(0,j-1)+backfrac+txt.substring(k);
    i=j+backfrac.length;
  }
  if(txt.charAt(0)=="+") txt=txt.substring(1);
  if(txt.charAt(txt.length-1)=="+") txt=txt.substring(0,txt.length-1);
  if(txt.charAt(txt.length-1)=="-") txt=txt.substring(0,txt.length-1);
  return txt;
}

// sin of pi/6, pi/4 and multiples in the from a/b + csqrt2/d + esqrt3/f
function sinpi(a,b) {
  var c=gcd(a,b);
  a/=c;
  b/=c;
  if(a==0) return [0,1,0,1,0,1];
  if(a==1&amp;&amp;b==6) return [1,2,0,1,0,1];
  if(a==1&amp;&amp;b==4) return [0,1,1,2,0,1];
  if(a==1&amp;&amp;b==3) return [0,1,0,1,1,2];
  if(a==1&amp;&amp;b==2) return [1,1,0,1,0,1];
  if(a==1&amp;&amp;b==1) return [0,1,0,1,0,1];
  if(a/b&gt;0.5&amp;&amp;a&lt;=b) return sinpi(b-a,b);
  if(a/b&gt;1&amp;&amp;a/b&lt;=1.5) {
    var A=new Array(6);
    A=sinpi(a-b,b);
    for(i=0;i&lt;6;i+=2) A[i]*=-1;
    return A;
  }
  if(a/b&gt;1.5&amp;&amp;a/b&lt;2) {
    var A=new Array(6);
    A=sinpi(2*b-a,b); 
    for(i=0;i&lt;6;i+=2) A[i]*=-1;
    return A;
  }
  return sinpi(a-2*b,b);
}

// cos as per above
function cospi(a,b) {
  return sinpi(2*a+b,2*b);
}

// returns a random number between min and max, one argument becomes -min to min
function rand(min,max) {
  if(typeof(max)=='undefined') {
    if(min&gt;0) min*=-1;
    max=-min;
  }
  return min+Math.floor((max-min+1)*Math.random());
}

// returns a random number between min and max, but not zero, one argument becomes -min to min
function randnz(min,max) {
   if(typeof(max)=='undefined') {
    if(min&gt;0) min*=-1;
    max=-min;
  }
  var a;
  while(!(a=rand(min,max)));
  return a;
}

// returns a random number from the list sent to the function
function pickrand() {
  return pickrand.arguments[rand(0,pickrand.arguments.length-1)];
}

// orders the arguments after r low to high and returns rth. r=0 returns max.
function rank(r) {
  var n=rank.arguments.length-1;
  if(r==0) r=n;
  list=new Array(n);
  for(var i=0;i&lt;n;i++) list[i]=rank.arguments[i+1];
  for(var i=0;i&lt;n;i++) {
    if(list[i]&gt;list[i+1]) {
      var c=list[i];
      list[i]=list[i+1];
      list[i+1]=c;
      i=-1;
    }
  }
  return list[r-1];
}

// root object a sqrt(n): reduces itself, write in latex
function sqroot(n) {
  if(n!=Math.floor(n)) alert("non-integer sent to square root");
  var a=1;
  for(var i=2;i*i&lt;=n;i++) {
    if(n%(i*i)==0){
      n/=(i*i);
      a*=i--;
    }
  }
  this.a=a;
  this.n=n;
  this.write=function() {
    if(this.a==1&amp;&amp;this.n==1) return "1";
    else if(this.a==1) return "\\sqrt{"+this.n+"}";
    else if(this.n==1) return this.a;
    else return this.a+"\\sqrt{"+this.n+"}";
  }
}

// fraction object top/bot: keeps itself in lowest terms, write in latex, assignment, equality check
function frac(top,bot) {
  this.top=typeof(top)!='undefined'?top:0;
  this.bot=typeof(bot)!='undefined'?bot:1;
  this.write=function() {
    this.reduce();
    if(this.bot==1) return this.top;
    if(this.top==0) return "0";
    else if(this.top&gt;0) return "\\frac{"+this.top+"}{"+this.bot+"}";
    else return "-\\frac{"+Math.abs(this.top)+"}{"+this.bot+"}";
  }
  this.reduce=function() {
    if(this.bot&lt;0) {
      this.top*=-1;
      this.bot*=-1;
    }
    var c=gcd(Math.abs(this.top),this.bot);
    this.top/=c;
    this.bot/=c;
  }
  this.set=function(a,b) {
    this.top=a;
    this.bot=b;
    this.reduce();
  }
  this.equals=function(b) {
    this.reduce();
    b.reduce();
    if(this.top==b.top&amp;&amp;this.bot==b.bot) return 1;
    else return 0;
  }
  this.reduce();
}

// vector object: constructed randomly, dot product with another vector, its magnitude squared, write it in latex, 
function vector(dim,maxentry) {
  this.dim=dim;
  for(var i=0;i&lt;this.dim;i++) this[i]=Math.round(-maxentry+2*maxentry*Math.random());
  this.dot=function(U) {
    sum=0;
    for(var i=0;i&lt;dim;i++) sum+=this[i]*U[i];
    return sum;
  }
  this.mag=function() {
    return this.dot(this);
  }
  this.write=function() {
    var q="\\left(\\begin\{array\}\{c\}"+this[0];
    for(var i=1;i&lt;this.dim;i++) q=q+"\\\\"+this[i];
    return q+"\\end\{array\}\\right)";
  }
  
}

// Partial Fractions
function makePartial(){
  var a=rand(1,8);
  var b=rand(1,8);
  var c=rand(1,8);
  var d=rand(1,8);
  var e=rand(1,8);
  var f=rand(1,8);

  var A=a*e+d*b;
  var B=a*f +d*c;
  var C=b*e;
  var D=c*e+b*f;
  var E=c*f;

  var qString='\\mbox{Express }\\frac{'+tidy(A+'x+'+B+'}{'+C+'x^2+'+D+'x+'+E)+'}\\mbox{ in partial fractions.}';
  var aString='\\frac{'+a+'}{'+b+'x+'+c+'}+\\frac{'+d+'}{'+e+'x+'+f+'}';

  var qa=[qString,tidy(aString)];
  return qa;
}

// Binomial Theorem
function makeBinomial2(){
  var a=rand(1,5);
  var b=randnz(6-a);
  var n=Math.round(3+Math.random()*(3-Math.max(0,Math.max(a-3,b-3))));

  var A=Math.pow(a,n);
  var B=n*Math.pow(a,n-1)*b;
  var C=n*(n-1)*Math.pow(a,n-2)/2*b*b;
  var D=n*(n-1)*(n-2)*Math.pow(a,n-3)/6*b*b*b;

  qString='\\mbox{Evaluate }('+tidy(a+'+'+b+'x)^'+n)+'\\mbox{ to the fourth term.}';
  aString=' '+A+'+'+B+'x+'+C+'x^2+'+D+'x^3.';

  var qa=[qString, tidy(aString)];
  return qa;
}

// Polynomial Integration
function makePolyInt(){
  var A=rand(-3,2);
  var B=rand(A+1,3);
  var a0=rand(6);
  var a1=rand(6);
  var a2,a3;
  while(!(a2=rand(6))&amp;&amp;!a0&amp;&amp;!a1);
  while(!(a3=rand(6))&amp;&amp;(!a1||!a2));

  qString="\\mbox\{Evaluate\}\\int_\{"+A+"\}^\{"+B+"\}"+tidy(a0+"+"+a1+"x+"+a2+"x^2+"+a3+"x^3")+"\\,dx";
  aString=12*a0*(B-A)+6*a1*(B*B-A*A)+4*a2*(B*B*B-A*A*A)+3*a3*(B*B*B*B-A*A*A*A);

  if(aString%12==0) aString/=12;
  else {
    var flag=0;
    if(aString&lt;0) {aString=Math.abs(aString); flag=1;}
    aString="\\frac\{"+Math.round(aString/gcd(12,aString))+"\}\{"+Math.round(12/gcd(12,aString))+"\}";
    if(flag==1) aString="-"+aString;
  }
  var qa = [qString, aString];
  return qa;
}

// Simple Trig Integration
function makeTrigInt() {
  var a=rand(0,7);
  var b=rand(1-Math.min(a,1),8);
  var A=a?randnz(4):0;
  var B=b?randnz(4):0;
  var U=pickrand(2,3,4,6);

  term1=a?A+"\\sin\{"+a+"x\}":"";
  term2=b?B+"\\cos\{"+b+"x\}":"";

  qString="\\mbox\{Evaluate\}\\int_\{0\}^\{\\pi/"+U+"\}"+tidy(term1+"+"+term2)+"\\,dx";

  soln1=new Array(6);
  soln2=new Array(6);
  soln=new Array(6);

  if(a) {
    soln1=cospi(a,U);
    for(i=0;i&lt;6;i+=2) soln1[i]*=-A;
    for(i=1;i&lt;6;i+=2) soln1[i]*=a;
    if(soln1[0]) {
      soln1[0]=soln1[1]*A+a*soln1[0];
      soln1[1]*=a;
    }
    else {
      soln1[0]=A;
      soln1[1]=a;
    }
  }
  else soln1=[0,1,0,1,0,1];

  if(b) {
    soln2=sinpi(b,U);
    for(i=0;i&lt;6;i+=2) soln2[i]*=B;
    for(i=1;i&lt;6;i+=2) soln2[i]*=b;
  }
  else soln2=[0,1,0,1,0,1];

  for(i=0;i&lt;6;i+=2) {
    soln[i]=soln1[i]*soln2[i+1]+soln1[i+1]*soln2[i];
    soln[i+1]=soln1[i+1]*soln2[i+1];
    if(soln[i+1]&lt;0) {
      soln[i]*=-1;
      soln[i+1]*=-1;
    }
    if(soln[i]) {
      c=gcd(Math.abs(soln[i]),soln[i+1]);
      soln[i]/=c;
      soln[i+1]/=c;
    }
  } 
  aString="";
  if(soln[0]&amp;&amp;soln[1]==1) aString+=soln[0];
  else if(soln[0]&gt;0) aString+="\\frac\{"+soln[0]+"\}\{"+soln[1]+"\}";
  else if(soln[0]&lt;0) aString+="-\\frac\{"+(-soln[0])+"\}\{"+soln[1]+"\}";
  if(soln[2]&amp;&amp;soln[3]==1) aString+="+"+soln[2]+"\\sqrt\{2\}";
  else if(soln[2]&gt;0) aString+="+"+"\\frac\{"+soln[2]+"\}\{"+soln[3]+"\}\\sqrt\{2\}";
  else if(soln[2]&lt;0) aString+="-\\frac\{"+(-soln[2])+"\}\{"+soln[3]+"\}\\sqrt\{2\}";
  if(soln[4]&amp;&amp;soln[5]==1) aString+="+"+soln[4]+"\\sqrt\{3\}";
  else if(soln[4]&gt;0) aString+="+"+"\\frac\{"+soln[4]+"\}\{"+soln[5]+"\}\\sqrt\{3\}";
  else if(soln[4]&lt;0) aString+="-\\frac\{"+(-soln[4])+"\}\{"+soln[5]+"\}\\sqrt\{3\}";

  aString=tidy(aString);
  if(aString=="") aString="0";
  var qa=[qString,aString];
  return qa;
}

// Vectors
function makeVector() {
  function ntol(n) {
    if(n==0) return "A";
    if(n==1) return "B";
    if(n==2) return "C";
    if(n==3) return "D";
  }
  A=new Array(4);
  for(var i=0;i&lt;4;i++) A[i]=new vector(3,10);
  B=new Array(0,1,2,3);
  for(var i=0;i&lt;3;i++)  {
    if(A[B[i]].mag()&lt;A[B[i+1]].mag()) {
      var c=B[i];
      B[i]=B[i+1];
      B[i+1]=c;
      i=-1;
    }
  }
  var v1,v2,v3;
  v1=rand(0,3);
  do {
    v2=rand(0,3);
  }
  while(v1==v2);
  do {
    v3=rand(0,3);
  }
  while(v1==v3||v2==v3);

  qString="\\begin\{array\}\{l\}\\mbox\{Consider the four vectors \} \\mathbf\{A\}="+A[0].write()+", \\mathbf\{B\}="+A[1].write()+", \\mathbf\{C\}="+A[2].write()+", \\mathbf\{D\}="+A[3].write()+".\\\\ \\\\ \\mbox\{  (i) Order the vectors by magnitude.\}\\\\ \\\\ \\mbox\{  (ii) Use the scalar product to find the angles between (a) \}\\mathbf\{"+ntol(v1)+"\} \\mbox\{ and \}\\mathbf\{"+ntol(v2)+"\}, \\mbox\{(b) \}\\mathbf\{"+ntol(v2)+"\} \\mbox\{ and \} \\mathbf\{"+ntol(v3)+"\}.\\end\{array\}";

  aString="\\begin\{array\}\{l\}\\mbox\{(i) \}|\\mathbf\{"+ntol(B[0])+"\}|=\\sqrt\{"+A[B[0]].mag()+"\},|\\mathbf\{"+ntol(B[1])+"\}|=\\sqrt\{"+A[B[1]].mag()+"\},|\\mathbf\{"+ntol(B[2])+"\}|=\\sqrt\{"+A[B[2]].mag()+"\},|\\mathbf\{"+ntol(B[3])+"\}|=\\sqrt\{"+A[B[3]].mag()+"\}.\\\\";

  top1=A[v1].dot(A[v2]);
  bot1=new sqroot(A[v1].mag()*A[v2].mag());
  var c=gcd(Math.abs(top1),bot1.a);
  top1/=c;
  bot1.a/=c;
  top2=A[v2].dot(A[v3]);
  bot2=new sqroot(A[v2].mag()*A[v3].mag());
  c=gcd(Math.abs(top2),bot2.a);
  top2/=c;
  bot2.a/=c;

  aString+="\\mbox\{(ii) (a) \}";
  if(top1==0) aString+="\\pi/2";
  else if(top1==1&amp;&amp;bot1.n==1&amp;&amp;bot1.a==1) aString+="0";
  else if(top1==-1&amp;&amp;bot1.n==1&amp;&amp;bot1.a==1) aString+="\\pi";
  else {
    aString+="\\arccos\\left(";
    if(bot1.a==1&amp;&amp;bot1.n==1) aString+=top1;
    else aString+="\\frac\{"+top1+"\}\{"+bot1.write()+"\}";
    aString+="\\right)";
  }
  aString+="\\mbox\{,  (b) \}";
  if(top2==0) aString+="\\pi/2";
  else if(top2==1&amp;&amp;bot2.n==1&amp;&amp;bot2.a==1) aString+="0";
  else if(top2==-1&amp;&amp;bot2.n==1&amp;&amp;bot2.a==1) aString+="\\pi";
  else { 
    aString+="\\arccos\\left(";
    if(bot2.a==1&amp;&amp;bot2.n==1) aString+=top2;
    else aString+="\\frac\{"+top2+"\}\{"+bot2.write()+"\}";
    aString+="\\right)";
  }
  aString+=".\\end\{array\}";
 
  var qa=[qString,aString];
  return qa;
}

// Lines in 3D
function makeLines() {
  var a1=randnz(3);
  var b1=randnz(3);
  var c1=randnz(3);
  var d1=rand(3);
  var e1=rand(3);
  var f1=rand(3);
  var a2,b2,c2,d2,e2,f2;
  var ch=rand(1,10); 
  if(ch&lt;6) {
    a2=randnz(3);
    b2=randnz(3);
    c2=randnz(3);
    d2=rand(3);
    e2=rand(3);
    f2=rand(3);
  }
  else if(ch&lt;10) {
    a2=randnz(2);
    b2=randnz(2);
    c2=randnz(2);
    if(a1*b1*c1%3==0&amp;&amp;a1*b1*c1%2==0) {
      if(rand(0,1)) {
        if(a1%3==0) a1/=3;
        if(b1%3==0) b1/=3;
        if(c1%3==0) c1/=3;
      }
      else {
        if(a1%2==0) a1/=2;
        if(b1%2==0) b1/=2;
        if(c1%2==0) c1/=2;
      }
    }
    if(a2*d1%a1!=0) {
      a2*=a1; b2*=a1; c2*=a1;
    }
    if(b2*e1%b1!=0) {
      a2*=b1; b2*=b1; c2*=b1;
    }
    if(c2*f1%c1!=0) {
      a2*=c1; b2*=c1; c2*=c1;
    }
    d2=a2*d1/a1;
    e2=b2*e1/b1;
    f2=c2*f1/c1;
    var m1=Math.abs(Math.min(d2,Math.min(e2,f2)));
    var m2=Math.max(d2,Math.max(e2,f2));
    if(m1&gt;4) { d2+=4; e2+=4; f2+=4; }
    if(m2&gt;4) { d2-=2; e2-=2; f2-=2; }
    if((m1=gcd(a2,b2,c2,d2,e2,f2))&gt;1) {
      a2/=m1;b2/=m1;c2/=m1;d2/=m1;e2/=m1;f2/=m1;
    }
  }
  else {
    var sn=randnz(2);
    a2=a1*sn;
    b2=b1*sn;
    c2=c1*sn;
    d2=rand(3);
    e2=rand(3);
    f2=rand(3);
  }
  var eqn1=tidy(a1+"x+"+d1)+"="+tidy(b1+"y+"+e1)+"="+tidy(c1+"z+"+f1);
  var eqn2=tidy(a2+"x+"+d2)+"="+tidy(b2+"y+"+e2)+"="+tidy(c2+"z+"+f2);

  qString="\\begin{array}{l}\\mbox{Consider the lines }"+eqn1+"\\mbox{ and }"+eqn2+".\\\\ \\mbox{Find the angle between them and determine whether they intersect.}\\end{array}";

  if(a1*b2==b1*a2&amp;&amp;b1*c2==c1*b2) {
    if(a2*b2*d1-b2*a1*d2==a2*b2*e1-a2*b1*e2&amp;&amp;b2*c2*e1-c2*b1*e2==b2*c2*f1-b2*c1*f2) aString="\\mbox{The lines are identical.}";
    else aString="\\mbox{The lines are parallel and do not meet.}";
  }

  else {
    cosbot=new sqroot((b1*b1*c1*c1+c1*c1*a1*a1+a1*a1*b1*b1)*(b2*b2*c2*c2+c2*c2*a2*a2+a2*a2*b2*b2));
    costh=new frac(b1*b2*c1*c2+c1*c2*a1*a2+a1*a2*b1*b2,cosbot.a);
    cosbot.a=costh.bot;
    aString="\\mbox{The angle between the lines is }";
    if(costh.top==0) aString+="\\pi/2.";
    else {
      aString+="\\arccos\\left(";
      if(cosbot.n==1) aString+=costh.write();
      else aString+="\\frac{"+costh.top+"}{"+cosbot.write()+"}";
      aString+="\\right)."
    }
    mu=new frac();
    lam1=new frac();
    lam2=new frac();
    if(a1*b2-a2*b1) {
      mu.set(a2*b2*(e1-d1)-a2*b1*e2+a1*b2*d2,a1*b2-a2*b1);
      lam1.set(b1*mu.top-b1*e2*mu.bot+e1*b2*mu.bot,mu.bot*b2);
      lam2.set(c1*mu.top-c1*f2*mu.bot+f1*c2*mu.bot,mu.bot*c2);
    }
    else {
      mu.set(b2*c2*(f1-e1)-b2*c1*f2+b1*c2*e2,b1*c2-b2*c1);
      lam1.set(c1*mu.top-c1*f2*mu.bot+f1*c2*mu.bot,mu.bot*c2);
      lam2.set(a1*mu.top-a1*d2*mu.bot+d1*a2*mu.bot,mu.bot*a2);
    }
    if(lam1.equals(lam2)) {
      xm=new frac(lam1.top-d1*lam1.bot,a1*lam1.bot);
      ym=new frac(lam1.top-e1*lam1.bot,b1*lam1.bot);
      zm=new frac(lam1.top-f1*lam1.bot,c1*lam1.bot);
      aString+="\\mbox{ The lines meet at the point }\\left("+xm.write()+","+ym.write()+","+zm.write()+"\\right).";
    }
    else aString+="\\mbox{ The lines do not meet.}";
  }
  var qa=[qString,aString];
  return qa;
}

function makeIneq() {
  function makeIneq2() {
    var a=randnz(6);
    var b;
    while(Math.abs(a)==(Math.abs(b=randnz(4)))); 
    var B=-a-b;
    var C=a*b;
    var qString="\\begin{array}{c}\\mbox{By factorizing a suitable polynomial, or otherwise, find the values of }x\\mbox{ which satisfy }\\\\ ";
    switch(rand(1,3)) {
      case 1:
      qString+=tidy("x^{2}+"+B+"x")+" &lt; "+(-C);
      break;
      case 2:
      qString+=tidy("x^{2}+"+C)+" &lt; "+tidy((-B)+"x");
      break;
      case 3:
      qString+="x^{2}"+" &lt; "+tidy((-B)+"x+"+(-C));
      break;
    }
    qString+=" \\end{array}";
    var aString=Math.min(a,b)+" &lt; x &lt; "+Math.max(a,b);
    var qa=[qString,aString];
    return qa;
  }

  function makeIneq3() {
    var a=randnz(5);
    var b=randnz(5);
    var c=rand(2);
    var qString="\\begin{array}{c}\\mbox{By factorizing a suitable polynomial, or otherwise, find the values of }y\\mbox{ which satisfy }\\\\ ";
    var B=-(a+b+c);
    var C=a*b+b*c+c*a;
    var D=-a*b*c;
    switch(rand(1,3)) {
      case 1:
      qString+=tidy("y^\{3\}+"+B+"y^\{2\}")+" &lt; "+tidy((-C)+"y+"+(-D));
      break;
      case 2:
      qString+=tidy("y^\{3\}+"+C+"y")+" &lt; "+tidy((-B)+"y^\{2\}+"+(-D));
      break;
      case 3:
      qString+=tidy("y^\{3\}+"+D)+" &lt; "+tidy((-B)+"y^\{2\}+"+(-C)+"y");
      break;
    }
    qString+=" \\end{array}";
    var aString="y &lt; "+rank(1,a,b,c);
    if(rank(2,a,b,c)!=rank(3,a,b,c)) aString+="\\mbox{ and }"+rank(2,a,b,c)+" &lt; y &lt; "+rank(3,a,b,c);
    var qa=[qString,aString];
    return qa;
  }
  var qa=rand(0,1) ? makeIneq2() : makeIneq3();
  return qa;
}

function makeAP() {
  ordinal=new Array("zeroth","first","second","third","fourth","fifth","sixth","seventh","eighth","ninth","tenth","eleventh");

  var m=rand(2,6);
  var n=rand(m+2,11);
  var k=rand(n+3,40);

  var qString="An arithmetic progression has "+ordinal[m]+" term \\alpha and "+ordinal[n]+" term \\beta. Find the sum to "+k+" terms.");

  a1=new frac(k*(2*n-1-k),2*(n-m));
  a2=new frac(k*(1+k-2*m),2*(n-m));
  
  var aString=tidy(a1.write()+"\\alpha+"+a2.write()+"\\beta");
  var qa=[qString,aString];
  return qa;
}
  

function makeproblem(){

  switch (document.qType.combo1.value) {
    case '1':
    var qa=makePartial();
    break;

    case '2':
    var qa=makeBinomial2();
    break;

    case '3':
    var qa=makePolyInt();
    break;

    case '4':
    var qa=makeTrigInt();
    break;

    case '5':
    var qa=makeVector();
    break;

    case '6':
    var qa=makeLines();
    break;

    case '7':
    var qa=makeIneq();
    break;

    case '8':
    var qa=makeAP();
    break;
    default:
    alert(&quot;Hewson, we have a problem&quot;);

    break;
  }

  var inline1 = document.getElementById(&quot;inline1&quot;);
  inline1.innerHTML = qa[1];
  inline1.className = &quot;math&quot;;
  var block1 = document.getElementById(&quot;block1&quot;);
  block1.innerHTML = qa[0];
  block1.className = &quot;math&quot;;
  jsMath.Translate.ProcessElement(block1);
  jsMath.Translate.ProcessElement(inline1);
 
  $('#hidden').toggle;
}

function showAnswer(){
  $('#hidden').toggle();
}


</script>



<br></br></mdoxml>
