Skip to content

Commit

Permalink
factoring multiple occurrences of a single factor at once
Browse files Browse the repository at this point in the history
  • Loading branch information
mathiash committed Mar 1, 2012
1 parent b849981 commit 18fcb8a
Showing 1 changed file with 32 additions and 18 deletions.
50 changes: 32 additions & 18 deletions utils/factoring-expressions.js
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
return expr; return expr;
}; };


var genTerm = function(factors, occFactors, iMarkedFactor) { var genTerm = function(factors, occFactors, iMarkedFactor, nbOccFactor) {
var args = []; var args = [];
var numFactors = 1; var numFactors = 1;
for (var iFactor = 0; iFactor < factors.length; iFactor++) { for (var iFactor = 0; iFactor < factors.length; iFactor++) {
Expand Down Expand Up @@ -36,29 +36,33 @@
expr = {op:"*", args:args}; expr = {op:"*", args:args};
} }
if (iMarkedFactor !== undefined) { if (iMarkedFactor !== undefined) {
var marked = setColor(factors[iMarkedFactor], KhanUtil.BLUE); var markedFactor = factors[iMarkedFactor];
if (nbOccFactor > 1) {
markedFactor = {op:"^", args:[markedFactor, nbOccFactor]};
}
markedFactor = setColor(markedFactor, KhanUtil.BLUE);
if (args.length === 0) { if (args.length === 0) {
expr = marked; expr = markedFactor;
} else { } else {
expr = {op:"times", args:[marked, expr]}; expr = {op:"times", args:[markedFactor, expr]};
} }
} else if (args.length === 0) { } else if (args.length === 0) {
expr = 1; expr = 1;
} }
return expr; return expr;
}; };


var genAllTerms = function(factors, termsOccFactors, iMarkedFactor) { var genAllTerms = function(factors, termsOccFactors, iMarkedFactor, nbOccFactor) {
var terms = []; var terms = [];
for (var iTerm = 0; iTerm < termsOccFactors.length; iTerm++) { for (var iTerm = 0; iTerm < termsOccFactors.length; iTerm++) {
terms.push(genTerm(factors, termsOccFactors[iTerm], iMarkedFactor)); terms.push(genTerm(factors, termsOccFactors[iTerm], iMarkedFactor, nbOccFactor));
} }
return terms; return terms;
}; };


var genFullExpr = function(factors, foundOccFactors, termOccFactors, iMarkedFactor, iNewFactor) { var genFullExpr = function(factors, foundOccFactors, termOccFactors, iMarkedFactor, iNewFactor, nbOccFactor) {
var remainingTerms = {op:"+", args:genAllTerms(factors, termOccFactors, iMarkedFactor)}; var remainingTerms = {op:"+", args:genAllTerms(factors, termOccFactors, iMarkedFactor, nbOccFactor)};
var sharedPart = genTerm(factors, foundOccFactors, iNewFactor); var sharedPart = genTerm(factors, foundOccFactors, iNewFactor, nbOccFactor);
if (sharedPart === 1) { if (sharedPart === 1) {
return remainingTerms; return remainingTerms;
} }
Expand All @@ -80,7 +84,7 @@
var iChosen; var iChosen;
do { do {
iChosen = KhanUtil.randRange(0, factors.length - 1); iChosen = KhanUtil.randRange(0, factors.length - 1);
} while ((typeof factors[iChosen] === "number") && (numTotal * factors[iChosen] > 50)); } while ((typeof factors[iChosen] === "number") && (numTotal * factors[iChosen] > 40));
if (typeof factors[iChosen] === "number") { if (typeof factors[iChosen] === "number") {
numTotal *= factors[iChosen]; numTotal *= factors[iChosen];
} }
Expand Down Expand Up @@ -128,17 +132,17 @@
nbNonShared = KhanUtil.randRange(1, factorsPerTerm); nbNonShared = KhanUtil.randRange(1, factorsPerTerm);
} }
for (var iNonShared = 0; iNonShared < nbNonShared; iNonShared++) { for (var iNonShared = 0; iNonShared < nbNonShared; iNonShared++) {
if (smallestFactorNum * termNumTotal > 100) { if (smallestFactorNum * termNumTotal > 80) {
break; break;
} }
var iChosen; var iChosen;
do { do {
iChosen = KhanUtil.randFromArray(availableFactors); iChosen = KhanUtil.randFromArray(availableFactors);
} while ((typeof factors[iChosen] === "number") && (termNumTotal * factors[iChosen] > 100)); } while ((typeof factors[iChosen] === "number") && (termNumTotal * factors[iChosen] > 80));
if (typeof factors[iChosen] === "number") { if (typeof factors[iChosen] === "number") {
termNumTotal *= factors[iChosen]; termNumTotal *= factors[iChosen];
minNumFactor = Math.min(factors[iChosen], minNumFactor); minNumFactor = Math.min(factors[iChosen], minNumFactor);
maxNumFactor = Math.min(factors[iChosen], maxNumFactor); maxNumFactor = Math.max(factors[iChosen], maxNumFactor);
} else { } else {
hasNonNumFactor = true; hasNonNumFactor = true;
} }
Expand All @@ -155,13 +159,23 @@
for (var iSharedFactor = 0; iSharedFactor < sharedFactors.length; iSharedFactor++) { for (var iSharedFactor = 0; iSharedFactor < sharedFactors.length; iSharedFactor++) {
prevExpr = curExpr; prevExpr = curExpr;
var iFactor = sharedFactors[iSharedFactor]; var iFactor = sharedFactors[iSharedFactor];
var nbOccFactor = occFactors[iFactor];
if (typeof factors[iFactor] === "number") {
nbOccFactor = 1;
}
for (var iTerm = 0; iTerm < nbTerms; iTerm++) { for (var iTerm = 0; iTerm < nbTerms; iTerm++) {
termOccFactors[iTerm][iFactor]--; termOccFactors[iTerm][iFactor] -= nbOccFactor;
} }
var markedExpr = genFullExpr(factors, foundOccFactors, termOccFactors, iFactor); var markedExpr = genFullExpr(factors, foundOccFactors, termOccFactors, iFactor, undefined, nbOccFactor);
curExpr = genFullExpr(factors, foundOccFactors, termOccFactors, undefined, iFactor); curExpr = genFullExpr(factors, foundOccFactors, termOccFactors, undefined, iFactor, nbOccFactor);
foundOccFactors[iFactor]++; var commonFactor;
hints.push("<p>We can see that all terms of the sum have <code>" + MATH.format(factors[iFactor]) + "</code>" + if (nbOccFactor === 1) {
commonFactor = factors[iFactor];
} else {
commonFactor = {op:"^", args:[factors[iFactor], nbOccFactor]};
}
foundOccFactors[iFactor] += nbOccFactor;
hints.push("<p>We can see that all terms of the sum have <code>" + MATH.format(commonFactor) + "</code>" +
" as a factor:</p><p><code>" + MATH.format({op:"=", args:[prevExpr, markedExpr]}) + "</code></p>" + " as a factor:</p><p><code>" + MATH.format({op:"=", args:[prevExpr, markedExpr]}) + "</code></p>" +
"<p>So we can rewrite the expression as: <code>" + MATH.format(curExpr) + "</code>. Are there other common factors?</p>"); "<p>So we can rewrite the expression as: <code>" + MATH.format(curExpr) + "</code>. Are there other common factors?</p>");
// We keep as wrong choices, expressions where not all common factors have been detected // We keep as wrong choices, expressions where not all common factors have been detected
Expand Down

0 comments on commit 18fcb8a

Please sign in to comment.