Exponent Rules Calculator
Three tools in one: combine powers with the product and quotient rules, expand a power of a power,
or tame zero and negative exponents. Every answer comes with the full working shown step by step.
Product & quotient of powers
Same base? Multiply → add the exponents. Divide → subtract. The base can be a number (2) or a letter (x).
Power of a power
A power raised to a power: multiply the exponents. (bm)n = bm·n.
Zero & negative exponents
b0 = 1 (for b ≠ 0). A negative exponent flips into the denominator: b−n = 1/bn.
function mulberry32(a){ return function(){ a |= 0; a = (a + 0x6D2B79F5) | 0; var t = Math.imul(a ^ (a >>> 15), 1 | a); t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t; return ((t ^ (t >>> 14)) >>> 0) / 4294967296; }; } function ri(rng, lo, hi){ return lo + Math.floor(rng() * (hi - lo + 1)); } function pick(rng, arr){ return arr[Math.floor(rng() * arr.length)]; } function shuffleArr(rng, a){ for (var i = a.length - 1; i > 0; i--){ var j = Math.floor(rng() * (i + 1)); var t = a[i]; a[i] = a[j]; a[j] = t; } return a; } function gcd(a, b){ a = Math.abs(a); b = Math.abs(b); while (b !== 0){ var t = a % b; a = b; b = t; } return a === 0 ? 1 : a; } function red(n, d){ if (d === 0) throw new Error('red: zero denominator'); if (d < 0){ n = -n; d = -d; } if (n === 0) return { n: 0, d: 1 }; var g = gcd(n, d); return { n: n / g, d: d / g }; } function escHTML(s){ return String(s).replace(/[&<>"']/g, function(c){ return {'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]; }); } function fmtInt(n){ return (n < 0 ? '\u2212' : '') + Math.abs(n); } function powHTML(base, e){ return '' + escHTML(base) + '' + e + ''; }
/* ---------------- pure logic (tested in node) ---------------- */ function validBase(s){ s = String(s).trim(); return /^[a-zA-Z0-9]+$/.test(s) ? s : null; } function validInt(s){ s = String(s).trim(); return /^-?\d+$/.test(s) ? parseInt(s, 10) : null; } function powHTMLd(base, e){ return '' + escHTML(base) + '' + e + ''; } function tryValue(base, e){ /* numeric base with a modest exponent -> concrete value, else null */ if (!/^[0-9]+$/.test(String(base))) return null; var b = parseInt(base, 10); if (e < -12 || e > 24) return null; var v = Math.pow(b, e); if (!isFinite(v)) return null; if (Math.abs(v) >= 1e15) return null; if (e < 0){ var d = Math.pow(b, -e); if (d > 1e12) return null; var f = red(1, d); return { text: f.n + '/' + f.d, html: '' + f.n + '' + f.d + '' }; } return { text: String(Math.round(v)), html: '' + Math.round(v) + '' }; } /* Tab 1: product / quotient. Returns {ok, err?, steps[], ansHTML, ansText} */ function calcRule(baseRaw, e1Raw, op, e2Raw){ var base = validBase(baseRaw); var e1 = validInt(e1Raw), e2 = validInt(e2Raw); if (base === null) return { ok:false, err:'Enter a base: letters or digits only (for example 2 or x).' }; if (e1 === null || e2 === null) return { ok:false, err:'Both exponents must be whole numbers (they can be negative).' }; if (!(op === 'mul' || op === 'div')) return { ok:false, err:'Choose multiply or divide.' }; var E = (op === 'mul') ? e1 + e2 : e1 - e2; var opSym = (op === 'mul') ? '·' : '/'; var opWord = (op === 'mul') ? 'add' : 'subtract'; var steps = []; steps.push('Start: ' + powHTMLd(base, e1) + ' ' + opSym + ' ' + powHTMLd(base, e2) + '.'); steps.push('Same base, ' + (op === 'mul' ? 'multiplying' : 'dividing') + ' → ' + opWord + ' the exponents: ' + escHTML(base) + '' + e1 + (op === 'mul' ? '+' : '−') + e2 + '.'); steps.push('Exponent arithmetic: ' + e1 + (op === 'mul' ? ' + ' : ' − ') + e2 + ' = ' + E + ', so the expression is ' + powHTMLd(base, E) + '.'); var ansHTML = powHTMLd(base, E), ansText = base + '^' + E; if (E < 0){ steps.push('Negative exponent → flip into the denominator: ' + powHTMLd(base, E) + ' = 1 / ' + powHTMLd(base, -E) + '.'); ansHTML = '1' + escHTML(base) + '' + (-E) + ''; ansText = '1/' + base + '^' + (-E); } var val = tryValue(base, E); if (!(val === null || E < 0)){ steps.push('Numeric base: ' + escHTML(base) + '' + E + ' = ' + val.text + '.'); ansHTML = val.html; ansText = val.text; } return { ok:true, steps:steps, ansHTML:ansHTML, ansText:ansText }; } /* Tab 2: power of a power */ function calcPowPow(baseRaw, aRaw, cRaw){ var base = validBase(baseRaw); var a = validInt(aRaw), c = validInt(cRaw); if (base === null) return { ok:false, err:'Enter a base: letters or digits only (for example 3 or x).' }; if (a === null || c === null) return { ok:false, err:'Both exponents must be whole numbers.' }; var E = a * c; var steps = []; steps.push('Start: (' + powHTMLd(base, a) + ')' + c + '.'); steps.push('Power of a power → multiply the exponents: ' + escHTML(base) + '' + a + '×' + c + '.'); steps.push('Exponent arithmetic: ' + a + ' × ' + c + ' = ' + E + ', so the expression is ' + powHTMLd(base, E) + '.'); var ansHTML = powHTMLd(base, E), ansText = base + '^' + E; var val = tryValue(base, E); if (!(val === null || E < 0)){ steps.push('Numeric base: ' + escHTML(base) + '' + E + ' = ' + val.text + '.'); ansHTML = val.html; ansText = val.text; } return { ok:true, steps:steps, ansHTML:ansHTML, ansText:ansText }; } /* Tab 3: zero / negative */ function calcZeroNeg(baseRaw, eRaw){ var base = validBase(baseRaw); var e = validInt(eRaw); if (base === null) return { ok:false, err:'Enter a base: letters or digits only (for example 2 or x).' }; if (e === null) return { ok:false, err:'The exponent must be a whole number.' }; var numeric = /^[0-9]+$/.test(String(base)); if (e === 0){ if (!(!numeric || parseInt(base, 10) !== 0)) return { ok:false, err:'0^0 is undefined — the zero-exponent rule needs a nonzero base.' }; return { ok:true, steps:['Zero-exponent rule: any nonzero base to the 0 power equals 1.', powHTMLd(base, 0) + ' = 1.'], ansHTML:'1', ansText:'1' }; } if (e > 0){ var ansH = powHTMLd(base, e), ansT = base + '^' + e; var steps0 = ['A positive exponent needs no flipping: ' + powHTMLd(base, e) + ' stays as it is.']; if (numeric){ var v0 = Math.pow(parseInt(base, 10), e); if (!( !isFinite(v0) || Math.abs(v0) >= 1e15 )){ steps0.push('Evaluate: ' + escHTML(base) + '' + e + ' = ' + v0 + '.'); ansH = '' + v0 + ''; ansT = String(v0); } else { steps0.push('The value is very large, so the power form is the simplest answer.'); } } else { steps0.push('Already simplified.'); } return { ok:true, steps:steps0, ansHTML:ansH, ansText:ansT }; } var pe = -e; var steps = []; steps.push('Negative exponent → flip into the denominator: ' + powHTMLd(base, e) + ' = 1 / ' + powHTMLd(base, pe) + '.'); var ansHTML = '1' + escHTML(base) + '' + pe + ''; var ansText = '1/' + base + '^' + pe; var val = tryValue(base, e); if (val !== null){ steps.push('Numeric base: 1 / ' + escHTML(base) + '' + pe + ' = 1 / ' + Math.pow(parseInt(base, 10), pe) + ' = ' + val.text + '.'); ansHTML = val.html; ansText = val.text; } return { ok:true, steps:steps, ansHTML:ansHTML, ansText:ansText }; }
/* ---------------- UI wiring ---------------- */ function el(id){ return document.getElementById(id); } function renderCalc(res, errId, resId, ansId, stepsId){ var err = el(errId), res = el(resId); if (!res.ok){ err.textContent = res.err; err.classList.add('show'); res.classList.remove('show'); return; } err.classList.remove('show'); el(ansId).innerHTML = 'Answer: ' + res.ansHTML + ''; el(stepsId).innerHTML = res.steps.map(function(s){ return '
'; }).join(''); res.classList.add('show'); } function initTool(){ var tabs = document.querySelectorAll('.tabbtn'); for (var i = 0; i < tabs.length; i++){ tabs[i].addEventListener('click', function(){ for (var j = 0; j < tabs.length; j++) tabs[j].classList.remove('active'); this.classList.add('active'); var panels = document.querySelectorAll('.panel'); for (var k = 0; k < panels.length; k++) panels[k].classList.remove('active'); document.getElementById(this.getAttribute('data-tab')).classList.add('active'); }); } el('t1go').addEventListener('click', function(){ renderCalc(calcRule(el('t1base').value, el('t1e1').value, el('t1op').value, el('t1e2').value), 't1err', 't1res', 't1ans', 't1steps'); }); el('t2go').addEventListener('click', function(){ renderCalc(calcPowPow(el('t2base').value, el('t2e1').value, el('t2e2').value), 't2err', 't2res', 't2ans', 't2steps'); }); el('t3go').addEventListener('click', function(){ renderCalc(calcZeroNeg(el('t3base').value, el('t3e').value), 't3err', 't3res', 't3ans', 't3steps'); }); } if (!(typeof document === 'undefined' || !document.addEventListener)){ document.addEventListener('DOMContentLoaded', initTool); }