g | x | w | all
Bytes Lang Time Link
736Bespoke250216T151633ZJosiah W
nan221021T182441Zbigyihsu
107JavaScript250215T005409ZWeird Gl
029AGL250215T232703ZErikDaPa
059APLNARS250214T192526ZRosario
108Java 10180522T083007ZKevin Cr
02005AB1E190510T082000ZKevin Cr
016Jelly190510T083253ZKevin Cr
156QBasic210701T205443ZDLosc
024Japt201013T214757ZShaggy
026Japt190509T232528ZOliver
132APLNARS190513T080429Zuser5898
097Powershell180810T135023Zmazzy
093PHP180521T132159ZTitus
112PHP170610T163403ZJör
031SageMath160920T170547Z12431234
052J150208T171255ZFUZxxl
074J150208T154443Zrandomra
078Perl141101T064756ZDanaJ
073Perl 5.10110406T215030ZJ B
nan110905T003913Zuser unk
119JavaScript110426T235340ZRy-
072J110407T214407ZJ B
112PHP110409T033804ZzzzzBov
107JavaScript110409T030252ZzzzzBov
133Python110406T234359ZKeith Ra
201OCaml110408T235153ZMatí
236PHP110407T213308ZKevin Br
7470Ruby 1.9110407T051102ZVentero
119Python 119 Chars110407T043833ZfR0DDY

Bespoke, 736 bytes

INPUT N
DO COPY
OUTPUT N
PUT XX:SEXTET I;OUTPUT CH
PUSH I
CONTROL DOWHILE
STACKTOP PLUSONE
PUSH I H V
CONTROL DOWHILE
STACKTOP PLUSONE
PUSH TRI DO COPYN
PUSH TRI DO COPYN
PUSH TRI DO COPYN
STACKTOP POW
STACKTOP MODULO
STACKTOP F
CONTROL END
STACKTOP MINUSONE
DO COPY
CONTROL IF
PUSH BI DO COPYN
OUTPUT N
DO COPY
STACKTOP MINUSONE
CONTROL IF
DO COPY
PUT XX:DIGITNINE FOUR;OUTPUT CH
OUTPUT N
CONTROL END
PUSH BI DO COPYN
DO SWITCH
STACKTOP POW
PUSH TRI DO ROT
DO TURNOVER
STACKTOP QUOTIENTOF
DO COPY
STACKTOP MINUSONE
CONTROL IF
PUT XX:FOUR BI;OUTPUT CH
CONTROL END
DO SWITCH
PUSH I
CONTROL END
DO P
DO COPY
PUSH BI STACKTOP POW
PUSH TRI DO COPYN
STACKTOP PLUSONE
STACKTOP LT
CONTROL END
DO P
DO COPY
STACKTOP MINUSONE
CONTROL IF
OUTPUT N

(I didn't have time to make a poetic version of this.)

Outputs 131784=2^3*3*17^2*19 for 131784. The factorization method is basically trial division, dividing the factors out of the number as they are found. (Some extra bytes are used to make it stop checking factors past the square root of the number; this is so it can run within 10 minutes.)

Given the largest prime in the specified range (4294967291), this program runs in ~5.5 seconds on my machine.

Go, 331 305 bytes

import(."fmt";."strings")
func f(n int)string{m,s,S:=make(map[int]int),[]string{},Sprint
for x,i:=n,2;i<=n;i++{if func(p int)int{if p>3{for i:=2;i*i<=p;i++{if p%i<1{return-1}}}
return p}(i)>0{for x%i<1{m[i]++;x/=i}}}
for k,v:=range m{a:=S(k);if v>1{a+="^"+S(v)};s=append(s,a)}
return S(n,"=",Join(s,"*"))}

Attempt This Online!

Returns a string of form n = f^e*f^e*f^e..., where n is the original number, f is a prime factor, and e is the exponent for that factor.

Byte count changed from 199 bytes to 331 bytes to handle the required output format.

JavaScript, 108 107 bytes

for(i=prompt(),s=i+"=",j=2,k=0;i>1|k;)i%j?(s+=k?(k>1?j+"^"+k:j)+(i>1?"*":""):"",j++,k=0):i/=++k&&j);alert(s)

Try it online! (Using Node.js, prompt() replaced by arguments and alert() replaced by console.log())

It is always nice to see if old answers can be improved. Would probably be even better using modern features, but it just wouldn't be the same. This can probably still be improved. Note that you can also move one of the variables into the prompt() call, which would save one byte, although it would also display its value inside the prompt window, which may be invalid.

AGL, 29 bytes

mp.*{.<~~'^+:#~~+}%'*s*"^1"s-

Explanation:

mp.*{.<~~'^+:#~~+}%'*s*"^1"s-
mp                            => all prime factors
  .*                          => groupby itself
    {.<~~'^+:#~~+}%           => '{factor}^{exponent}'
                   '*s*       => '*'.join()
                       "^1"s- => remove all '^1'

APL(NARS), 59 chars

{(⍕⍵),'=',¯1↓∊(⊂⊂'^1')∼⍨¨(⍕¨↑¨p),¨(⊂¨'^',¨⍕¨≢¨p←⊂⍨π⍵),¨'*'}

Input must be > 1. Test:

  f←{(⍕⍵),'=',¯1↓∊(⊂⊂'^1')∼⍨¨(⍕¨↑¨p),¨(⊂¨'^',¨⍕¨≢¨p←⊂⍨π⍵),¨'*'}
  f 131784
131784=2^3*3*17^2*19
  f 2*31
2147483648=2^31
  f 31
31=31
  f 15
15=3*5
  f 36
36=2^2*3^2

Java 10, 109 108 bytes (lambda function)

n->{var r=n+"=";for(int i=1,f;i++<n;r+=f<1?"":(f<2?i:i+"^"+f)+(n>1?"*":""))for(f=0;n%i<1;n/=i)f++;return r;}

Try it online.

Java 6+, 181 bytes (full program)

class M{public static void main(String[]a){long n=new Long(a[0]),i=1,f;String r=n+"=";for(;i++<n;r+=f<1?"":(f<2?i:i+"^"+f)+(n>1?"*":""))for(f=0;n%i<1;n/=i)f++;System.out.print(r);}}

Try it online.

-1 byte thanks to @ceilingcat.

Explanation:

n->{                // Method with integer parameter and String return-type
  var r=n+"=";      //  Result-String, starting at the input with an appended "="
  for(int i=1,f;i++<n;
                    //  Loop in the range [2, n]
      r+=           //    After every iteration: append the following to the result-String:
        f<1?        //     If the factor `f` is 0:
         ""         //      Append nothing
        :           //     Else:
         (f<2?      //      If the factor `f` is 1:
           i        //       Append the current prime `i`
          :         //      Else:
           i+"^"+f) //       Append the current prime `i` with it's factor `f`
         +(n>1?     //      And if we're not done yet:
            "*"     //       Also append a "*"
           :        //      Else:
            ""))    //       Append nothing more
    for(f=0;        //   Reset the factor `f` to 0
        n%i<1;      //   Loop as long as `n` is divisible by `i`
      n/=i)         //    Divide `n` by `i`
      f++;          //    Increase the factor `f` by 1
  return r;}        //  Return the result-String

05AB1E, 22 20 bytes

ÐfsÓ0Køε1K'^ý}'*ý'=ý

-2 bytes thanks to @Emigna.

Try it online.

Explanation:

Ð                # Triplicate the (implicit) input-integer
 f               # Pop and push all prime factors (without counting duplicates)
  s              # Swap to take the input again
   Ó             # Get all prime exponents
    0K           # Remove all 0s from the exponents list
      ø          # Zip it with the prime factors, creating pairs
       ε         # Map each pair to:
        1K       #  Remove all 1s from the pair
        '^ý     '#  And then join by "^"
       }'*ý     '# After the map: join the string/integers by "*"
           '=ý  '# And join the stack by "=" (with the input we triplicated at the start)
                 # (after which the result is output implicitly)

Jelly, 16 bytes

³”=³ÆFḟ€1j€”^j”*

One of my first Jelly answers, so can definitely be golfed (especially ³”=³)..

Try it online.

Explanation:

³                 # Push the first argument
 ”=               # Push string "="
   ³ÆF            # Get the prime factor-exponent pairs of the first argument
      ḟ€1         # Remove all 1s from each pair
         j€”^     # Join each pair by "^"
             j”*  # Join the pair of strings by "*"
                  # (implicitly join the entire 'stack' together)
                  # (which is output implicitly as result)

QBasic, 156 characters

INPUT n#
?n#;"=";
f=2
1c=0
WHILE n#/f=INT(n#/f)
n#=n#/f
c=c+1
WEND
IF c THEN?f;
IF c>1THEN?"^";c;
IF c*(n#>1)THEN?"*";
f=f+1
IF f*f<=n#GOTO 1
IF n#>1THEN?n#

When run at Archive.org, this takes about 2½ minutes to finish for an input of 4294967291, the largest prime in the specified range.

Ungolfed, with some remarks

This is the version I used to get the timing information:

CLS
INPUT num#
PRINT num#; "=";
factor = 2

startTime# = TIMER

DO
    count = 0
    WHILE num# / factor = INT(num# / factor)
        num# = num# / factor
        count = count + 1
    WEND
    IF count > 0 THEN PRINT factor;
    IF count > 1 THEN PRINT "^"; count;
    IF count > 0 AND num# > 1 THEN PRINT "*";
    factor = factor + 1
LOOP WHILE factor * factor <= num#

IF n# > 1 THEN PRINT n# ELSE PRINT

time# = TIMER - startTime#
PRINT "Search took"; INT(time# / 60); "minutes and";
PRINT INT(time# mod 60); "seconds"

The program uses the standard approach of trial division of each factor between \$2\$ and \$\sqrt n\$. It prints a * after each successful factor if the remaining \$n\$ is still greater than 1. If the factor becomes greater than \$\sqrt n\$ while \$n > 1\$, then \$n\$ is prime and we output it after exiting the loop.

A few extra bytes had to be spent to cope with very large numbers:

QBasic's numbers are either single- or double-precision floating point under the hood, although it casts to integers for certain calculations. Integers greater than \$2^{24}\$ are not guaranteed to be accurately represented in single-precision floating point, so we have to use double-precision for \$n\$ (thus the double-precision sigil on the variable num#). However, since we're only checking factors up to \$\sqrt n < 2^{16}\$, we can use the default single precision for factor.

At first, I had WHILE num# MOD factor = 0 for the inner loop. This worked until I tried numbers close to \$2^{32}\$, at which point it said "Overflow." It seems that the MOD operator casts its operands to integers--specifically, 32-bit signed integers. A value of \$2^{32}-1\$ can fit in a 32-bit unsigned integer, but not a signed one. So MOD wasn't going to work. Neither was my usual golf trick of checking divisibility with a/b=a\b, since the int-div operator \ also casts to integers. Fortunately, I could still use floating point division and then truncate explicitly with the INT function (which seemingly does not cast to integer--??).

Given the issues with single- vs. double-precision, I assumed that squaring factor (single-precision) before comparing it with num# (double) wasn't going to work. But surprisingly, it did. My best guess after some experimentation is that if there's a double-precision value anywhere in an expression, QBasic casts all of the values to double before computing anything. This contrasts with C, for example, where implicit casting only occurs between the operands of a single operator.

Japt, 24 bytes

+'=+Uk ü ËÎ+DÅÊÎç^+DÊÃq*

Try it

Japt, 28 27 26 bytes

-1 byte thanks to Shaggy

+'=+Uk ü ®ÊÉ?ZÌ+'^+Zl:ZÃq*

Try it

APL(NARS), 66 chars, 132 bytes

{(⍕⍵),'=',3↓∊{m←' * ',⍕↑⍵⋄1=w←2⊃⍵:m⋄m,'^',⍕w}¨v,¨+/¨{k=⍵}¨v←∪k←π⍵}

test and comment:

  f←{(⍕⍵),'=',3↓∊{m←' * ',⍕↑⍵⋄1=w←2⊃⍵:m⋄m,'^',⍕w}¨v,¨+/¨{k=⍵}¨v←∪k←π⍵}
  f 131784
131784=2^3 * 3 * 17^2 * 19
  f 2
2=2
  f (2*32)
4294967296=2^32

{(⍕⍵),'=',3↓∊{m←' * ',⍕↑⍵⋄1=w←2⊃⍵:m⋄m,'^',⍕w}¨v,¨+/¨{k=⍵}¨v←∪k←π⍵}
k←π⍵      find the factors with repetition of ⍵ and assign that array to k example for 12 k is 2 2 3
v←∪       gets from k unique elements and put them in array v
+/¨{k=⍵}¨ for each element of v count how many time it appear in k (it is array exponents)
v,¨       make array of couples from element of v (factors unique) and the array above (exponents unique)
∊{m←' * ',⍕↑⍵⋄1=w←2⊃⍵:m⋄m,'^',⍕w}¨ pretty print the array of couples factor exponent as array chars
3↓                                 but not the first 3 chars
(⍕⍵),'='  but print first the argument and '=' in char format

if someone has many time with these primitives, know them very well them, for me it is possible that the code is clearer of comments... so code more clear than comments, comments unuseful...

Powershell, 113 97 bytes

Inspired by Joey's answer. It's a slow but short.

param($x)(2..$x|%{for(;!($x%$_)){$_
$x/=$_}}|group|%{$_.Name+"^"+$_.Count-replace'\^1$'})-join'*'

Explained test script:

$f = {

param($x)               # let $x stores a input number > 0
(2..$x|%{               # loop from 2 to initial input number
    for(;!($x%$_)){     # loop while remainder is 0
        $_              # push a current value to a pipe
        $x/=$_          # let $x is $x/$_ (new $x uses in for condition only)
    }
}|group|%{              # group all values
    $_.Name+"^"+$_.Count-replace'\^1$'  # format and remove last ^1
})-join'*'              # make string with *

}

&$f 2
&$f 126
&$f 129
&$f 86240
#&$f 7775460

Output:

2
2*3^2*7
3*43
2^5*5*7^2*11

PHP, 93 bytes

<?=$n=$argn;for($i=2;$n>1;$k&&$p=print($p?"*":"=")."$i^$k",$i++)for($k=0;$n%$i<1;$n/=$i)$k++;

I could do 89 bytes with PHP 5.5 (or later), but that postdates the challenge by more than 2 years:

<?=$n=$argn;for($i=2;$n>1;$k&&$p=print"=*"[$p]."$i^$k",$i++)for($k=0;$n%$i<1;$n/=$i)$k++;

Run as pipe with -nF or try them online.

PHP, 112 bytes

<?=$a=$argn,"=";for($i=2;1<$a;)$a%$i?$i++:$a/=$i+!++$r[$i];foreach($r as$k=>$v)echo$t?"*":!++$t,$v<2?$k:"$k^$v";

Try it online!

SageMath, 31 Bytes

N=input()
print N,"=",factor(N)

Test case: 83891573479027823458394579234582347590825792034579235923475902312344444 Outputs:

83891573479027823458394579234582347590825792034579235923475902312344444 = 2^2 * 3^2 * 89395597 * 98966790508447596609239 * 263396636003096040031295425789508274613

J, 53 52 characters

This solution takes the rplc trick from the solution of randomra but comes up with some original ideas, too.

":,'=',(":@{.,'^','*',~":@#)/.~@q:}:@rplc'^1*';'*'"_

In non-tacit notation, this function becomes

f =: 3 : 0
(": y) , '=' , }: (g/.~ q: y) rplc '^1*' ; '*'
)

where g is defined as

g =: 3 : 0
": {. y) , '^' , (": # y) , '*'
)

J, 74 chars

f=.3 :0
(":y),'=',' '-.~('^1 ';'')rplc~}:,,&' *'"1(,'^'&,)&":/"{|:__ q:y
)

   f 131784
131784=2^3*3*17^2*19

64 chars with input in variable x:

   x=.131784

   (":x),'=',' '-.~('^1 ';'')rplc~}:,,&' *'"1(,'^'&,)&":/"{|:__ q:x
131784=2^3*3*17^2*19

Perl, 78

use ntheory":all";say join" * ",map{(join"^",@$_)=~s/\^1$//r}factor_exp(shift)

It uses the s///r feature of Perl 5.14 to elide the ^1s. 81 characters to run in a loop:

perl -Mntheory=:all -nE 'chomp;say join" * ",map{(join"^",@$_)=~s/\^1$//r}factor_exp($_);'

Perl 5.10, 73 88

perl -pe '$_=`factor $_`;s%( \d+)\K\1+%-1-length($&)/length$1%ge;y, -,*^,;s;\D+;=;'

Takes input number from standard input. Will compute factors for multiple inputs if provided.

Counted as a difference to perl -e. 5.10 is needed for the \K regex metacharacter.

Scala 374:

def f(i:Int,c:Int=2):List[Int]=if(i==c)List(i)else 
if(i%c==0)c::f(i/c,c)else f(i,c+1)
val r=f(readInt)
class A(val v:Int,val c:Int,val l:List[(Int,Int)])
def g(a:A,i:Int)=if(a.v==i)new A(a.v,a.c+1,a.l)else new A(i,1,(a.v,a.c)::a.l)
val a=(new A(r.head,1,Nil:List[(Int,Int)])/:(r.tail:+0))((a,i)=>g(a,i))
a.l.map(p=>if(p._2==1)p._1 else p._1+"^"+p._2).mkString("", "*", "")

ungolfed:

def factorize (i: Int, c: Int = 2) : List [Int] = {
  if (i == c) List (i) else 
    if (i % c == 0) c :: f (i/c, c) else 
      f (i, c+1)
}
val r = factorize (readInt)
class A (val value: Int, val count: Int, val list: List [(Int, Int)])
def g (a: A, i: Int) = 
  if (a.value == i) 
    new A (a.value, a.count + 1, a.list) else 
    new A (i, 1, (a.value, a.count) :: a.list)
val a = (new A (r.head, 1, Nil: List[(Int,Int)]) /: (r.tail :+ 0)) ((a, i) => g (a, i))
a.l.map (p => if (p._2 == 1) p._1 else
  p._1 + "^" + p._2).mkString ("", "*", "")

JavaScript, 124 122 119

for(s='',i=2,o=p=prompt();i<o;i++){for(n=0;!(p%i);n++)p/=i;n?s+=i+(n-1?'^'+n:'')+'*':0}alert(s.substring(0,s.length-1))

J, 72

(":*/f),'=',([,'*',])/(":"0~.f),.(('^',":)`(''"0)@.(=&1))"0+/(=/~.)f=.q:161784

Typical J. Two characters to do most of the work, sixty characters to present it.

Edit: Fixed the character count.

PHP, 112

echo$n=$_GET[0],'=';$c=0;for($i=2;;){if($n%$i<1){$c++;$n/=$i;}else{if($c){echo"$i^$c*";}$c=0;if(++$i>$n)break;}}

118

echo $n=$_GET[0],'=';for($i=2;;){if(!($n%$i)){++$a[$i];$n/=$i;}else{if($a[$i])echo "$i^$a[$i]*";$i++;if($i>$n)break;}}

JavaScript, 107

n=prompt()
s=n+'='
c=0
for(i=2;;){if(n%i<1){c++
n/=i}else{if(c)s+=i+'^'+c+'*'
c=0
if(++i>n)break}}
alert(s)

120

n=prompt()
o={2:0}
for(i=2,c=n;i<=c;)!(c%i)?++o[i]?c/=i:0:o[++i]=0
s=n+'='
for(i in o)s+=o[i]?i+'^'+o[i]+'*':''
alert(s)

Python, 140 135 133 chars

M=N=input()
s=''
f=1
while f<4**8:
 f+=1;e=0
 while N%f<1:e+=1;N/=f
 if e:s+='*%d'%f+'^%d'%e*(e>1)
print M,'=',(s+'*%d'%N*(N>1))[1:]

OCaml, 201 characters

A direct imperative translation of the best Python code:

let(%)s d=if!d>1then Printf.printf"%s%d"s!d
let f n=let x,d,e,s=ref n,ref 1,ref 0,ref"="in""%x;while!d<65536do
incr d;e:=0;while!x mod!d=0do x:=!x/ !d;incr e
done;if!e>0then(!s%d;"^"%e;s:="*")done;!s%x

For example,

# f 4294967292;;
4294967292=2^2*3^2*7*11*31*151*331- : unit = ()

(note that I've omitted outputting the final endline.) Just for fun, at 213 characters, a purely functional version, thoroughly obfuscated through liberal use of operators:

let(%)s d=if d>1then Printf.printf"%s%d"s d
let f x=let s=ref"="in""%x;let rec(@)x d=if d=65536then!s%x else
let rec(^)x e=if x/d*d<x then x,e else x/d^e+1in
let x,e=x^0in if e>0then(!s%d;"^"%e;s:="*");x@d+1in x@2

PHP, 236 characters

$f[$n=$c=$argv[1]]++;echo"$n=";while($c){$c=0;foreach($f as$k=>$n)for($r=~~($k/2);$r>1;$r--){if($k%$r==0){unset($f[$k]);$f[$r]++;$f[$k/$r]++;$c=1;break;}}}foreach($f as$k=>$n)if(--$n)$f[$k]="$k^".++$n;else$f[$k]=$k;echo implode("*",$f);

Output for 131784: 2^3*3*17^2*19

Completes all numbers within a few seconds while testing.

4294967296=2^32
Time: 0.000168

Input was never specified, so I chose to call it using command line arguments.

php factorize.php 4294967296

Ruby 1.9, 74 70 characters

#!ruby -plrmathn
$_+=?=+$_.to_i.prime_division.map{|a|a[0,a[1]]*?^}*?*

Edits:

Python 119 Chars

M=N=input()
i=1
s=""
while N>1:
 i+=1;c=0
 while N%i<1:c+=1;N/=i
 if c:s+=" * %d"%i+['','^%d'%c][c>1]
print M,'=',s[3:]