long int triptych(long int n) {
  int largest_prime = 0;
  if (n % 2 == 0) {
    largest_prime = 2;
    while (n % 2 == 0) {
      n /= 2;
    }
  }
  if (n % 3 == 0) {
    largest_prime = 3;
    while (n % 2 == 0) {
      n /= 3;
    }
  }
  int mult_of_six = 6;
  while (mult_of_six - 1 <= n) {
    if (n % (mult_of_six - 1) == 0) {
      largest_prime = mult_of_six - 1;
      while (n % largest_prime == 0) {
        n /= largest_prime;
      }
    }
    if (n % (mult_of_six + 1) == 0) {
      largest_prime = mult_of_six + 1;
      while (n % largest_prime == 0) {
        n /= largest_prime;
      }
    }
    mult_of_six += 6;
  }
  return largest_prime;
}


x86 assembly (clang, -O0):
<triptych>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    $0x2,%ecx
cqto
idiv   %rcx
cmp    $0x0,%rdx
jne    1162 <triptych+0x62>
movl   $0x2,-0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    $0x2,%ecx
cqto
idiv   %rcx
cmp    $0x0,%rdx
jne    115d <triptych+0x5d>
mov    -0x8(%rbp),%rax
mov    $0x2,%ecx
cqto
idiv   %rcx
mov    %rax,-0x8(%rbp)
jmp    112e <triptych+0x2e>
jmp    1162 <triptych+0x62>
mov    -0x8(%rbp),%rax
mov    $0x3,%ecx
cqto
idiv   %rcx
cmp    $0x0,%rdx
jne    11b5 <triptych+0xb5>
movl   $0x3,-0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    $0x2,%ecx
cqto
idiv   %rcx
cmp    $0x0,%rdx
jne    11b0 <triptych+0xb0>
mov    -0x8(%rbp),%rax
mov    $0x3,%ecx
cqto
idiv   %rcx
mov    %rax,-0x8(%rbp)
jmp    1181 <triptych+0x81>
jmp    11b5 <triptych+0xb5>
movl   $0x6,-0x10(%rbp)
mov    -0x10(%rbp),%eax
sub    $0x1,%eax
cltq
cmp    -0x8(%rbp),%rax
jg     128a <triptych+0x18a>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
cqto
idiv   %rcx
cmp    $0x0,%rdx
jne    1225 <triptych+0x125>
mov    -0x10(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0xc(%rbp)
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
cqto
idiv   %rcx
cmp    $0x0,%rdx
jne    1220 <triptych+0x120>
movslq -0xc(%rbp),%rcx
mov    -0x8(%rbp),%rax
cqto
idiv   %rcx
mov    %rax,-0x8(%rbp)
jmp    11f3 <triptych+0xf3>
jmp    1225 <triptych+0x125>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
cqto
idiv   %rcx
cmp    $0x0,%rdx
jne    127c <triptych+0x17c>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
cqto
idiv   %rcx
cmp    $0x0,%rdx
jne    1277 <triptych+0x177>
movslq -0xc(%rbp),%rcx
mov    -0x8(%rbp),%rax
cqto
idiv   %rcx
mov    %rax,-0x8(%rbp)
jmp    124a <triptych+0x14a>
jmp    127c <triptych+0x17c>
mov    -0x10(%rbp),%eax
add    $0x6,%eax
mov    %eax,-0x10(%rbp)
jmp    11bc <triptych+0xbc>
movslq -0xc(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<triptych>:
xor    %r8d,%r8d
test   $0x1,%dil
jne    1129 <triptych+0x29>
nopl   0x0(%rax)
mov    %rdi,%rax
shr    $0x3f,%rax
add    %rax,%rdi
sar    %rdi
test   $0x1,%dil
je     1110 <triptych+0x10>
mov    $0x2,%r8d
movabs $0xaaaaaaaaaaaaaaab,%rax
aa aa aa
imul   %rdi,%rax
movabs $0x2aaaaaaaaaaaaaaa,%rcx
aa aa 2a
add    %rax,%rcx
movabs $0x5555555555555554,%rax
55 55 55
cmp    %rax,%rcx
ja     1186 <triptych+0x86>
mov    $0x3,%r8d
test   $0x1,%dil
jne    1186 <triptych+0x86>
movabs $0x5555555555555556,%rcx
55 55 55
nopl   0x0(%rax)
mov    %rdi,%rax
imul   %rcx
mov    %rdx,%rdi
shr    $0x3f,%rdi
add    %rdx,%rdi
test   $0x1,%dil
je     1170 <triptych+0x70>
cmp    $0x5,%rdi
jge    1190 <triptych+0x90>
movslq %r8d,%rax
ret
mov    $0x5,%ecx
mov    $0x6,%esi
jmp    11b3 <triptych+0xb3>
nopl   0x0(%rax)
mov    %ecx,%r8d
mov    %rsi,%rcx
add    $0x6,%rsi
add    $0x5,%rcx
cmp    %rcx,%rdi
jl     118c <triptych+0x8c>
mov    %rdi,%rax
or     %rcx,%rax
shr    $0x20,%rax
je     11d0 <triptych+0xd0>
mov    %rdi,%rax
cqto
idiv   %rcx
test   %rdx,%rdx
jne    1232 <triptych+0x132>
jmp    11ed <triptych+0xed>
xchg   %ax,%ax
mov    %edi,%eax
xor    %edx,%edx
div    %ecx
test   %rdx,%rdx
jne    1232 <triptych+0x132>
jmp    11ed <triptych+0xed>
nopl   (%rax)
mov    %rdi,%rax
cqto
idiv   %rcx
test   %rdx,%rdx
jne    122f <triptych+0x12f>
mov    %rdi,%rax
or     %rcx,%rax
shr    $0x20,%rax
je     1210 <triptych+0x110>
mov    %rdi,%rax
cqto
idiv   %rcx
mov    %rax,%rdi
jmp    1218 <triptych+0x118>
cs nopw 0x0(%rax,%rax,1)
mov    %edi,%eax
xor    %edx,%edx
div    %ecx
mov    %eax,%edi
mov    %rdi,%rax
or     %rcx,%rax
shr    $0x20,%rax
jne    11e0 <triptych+0xe0>
mov    %edi,%eax
xor    %edx,%edx
div    %ecx
test   %rdx,%rdx
je     11ed <triptych+0xed>
mov    %ecx,%r8d
mov    %rsi,%rcx
or     $0x1,%rcx
mov    %rdi,%rax
or     %rsi,%rax
shr    $0x20,%rax
je     1260 <triptych+0x160>
mov    %rdi,%rax
cqto
idiv   %rcx
test   %rdx,%rdx
jne    11a3 <triptych+0xa3>
jmp    1291 <triptych+0x191>
nopl   0x0(%rax,%rax,1)
mov    %edi,%eax
xor    %edx,%edx
div    %ecx
test   %rdx,%rdx
jne    11a3 <triptych+0xa3>
jmp    1291 <triptych+0x191>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    %rdi,%rax
cqto
idiv   %rcx
test   %rdx,%rdx
jne    11a0 <triptych+0xa0>
mov    %rdi,%rax
or     %rcx,%rax
shr    $0x20,%rax
je     12b0 <triptych+0x1b0>
mov    %rdi,%rax
cqto
idiv   %rcx
mov    %rax,%rdi
jmp    12b8 <triptych+0x1b8>
nopw   0x0(%rax,%rax,1)
mov    %edi,%eax
xor    %edx,%edx
div    %ecx
mov    %eax,%edi
mov    %rdi,%rax
or     %rcx,%rax
shr    $0x20,%rax
jne    1280 <triptych+0x180>
mov    %edi,%eax
xor    %edx,%edx
div    %ecx
test   %rdx,%rdx
je     1291 <triptych+0x191>
jmp    11a0 <triptych+0xa0>

LLVM IR (-O0):
define i64 @triptych(i64 %0) {
%2 = alloca i64
%3 = alloca i32
%4 = alloca i32
store i64 %0, i64* %2
store i32 0, i32* %3
%5 = load i64, i64* %2
%6 = srem i64 %5, 2
%7 = icmp eq i64 %6, 0
br i1 %7, label %8, label %17
8: ; preds = %1
store i32 2, i32* %3
br label %9
9: ; preds = %13, %8
%10 = load i64, i64* %2
%11 = srem i64 %10, 2
%12 = icmp eq i64 %11, 0
br i1 %12, label %13, label %16
13: ; preds = %9
%14 = load i64, i64* %2
%15 = sdiv i64 %14, 2
store i64 %15, i64* %2
br label %9
16: ; preds = %9
br label %17
17: ; preds = %16, %1
%18 = load i64, i64* %2
%19 = srem i64 %18, 3
%20 = icmp eq i64 %19, 0
br i1 %20, label %21, label %30
21: ; preds = %17
store i32 3, i32* %3
br label %22
22: ; preds = %26, %21
%23 = load i64, i64* %2
%24 = srem i64 %23, 2
%25 = icmp eq i64 %24, 0
br i1 %25, label %26, label %29
26: ; preds = %22
%27 = load i64, i64* %2
%28 = sdiv i64 %27, 3
store i64 %28, i64* %2
br label %22
29: ; preds = %22
br label %30
30: ; preds = %29, %17
store i32 6, i32* %4
br label %31
31: ; preds = %81, %30
%32 = load i32, i32* %4
%33 = sub nsw i32 %32, 1
%34 = sext i32 %33 to i64
%35 = load i64, i64* %2
%36 = icmp sle i64 %34, %35
br i1 %36, label %37, label %84
37: ; preds = %31
%38 = load i64, i64* %2
%39 = load i32, i32* %4
%40 = sub nsw i32 %39, 1
%41 = sext i32 %40 to i64
%42 = srem i64 %38, %41
%43 = icmp eq i64 %42, 0
br i1 %43, label %44, label %59
44: ; preds = %37
%45 = load i32, i32* %4
%46 = sub nsw i32 %45, 1
store i32 %46, i32* %3
br label %47
47: ; preds = %53, %44
%48 = load i64, i64* %2
%49 = load i32, i32* %3
%50 = sext i32 %49 to i64
%51 = srem i64 %48, %50
%52 = icmp eq i64 %51, 0
br i1 %52, label %53, label %58
53: ; preds = %47
%54 = load i32, i32* %3
%55 = sext i32 %54 to i64
%56 = load i64, i64* %2
%57 = sdiv i64 %56, %55
store i64 %57, i64* %2
br label %47
58: ; preds = %47
br label %59
59: ; preds = %58, %37
%60 = load i64, i64* %2
%61 = load i32, i32* %4
%62 = add nsw i32 %61, 1
%63 = sext i32 %62 to i64
%64 = srem i64 %60, %63
%65 = icmp eq i64 %64, 0
br i1 %65, label %66, label %81
66: ; preds = %59
%67 = load i32, i32* %4
%68 = add nsw i32 %67, 1
store i32 %68, i32* %3
br label %69
69: ; preds = %75, %66
%70 = load i64, i64* %2
%71 = load i32, i32* %3
%72 = sext i32 %71 to i64
%73 = srem i64 %70, %72
%74 = icmp eq i64 %73, 0
br i1 %74, label %75, label %80
75: ; preds = %69
%76 = load i32, i32* %3
%77 = sext i32 %76 to i64
%78 = load i64, i64* %2
%79 = sdiv i64 %78, %77
store i64 %79, i64* %2
br label %69
80: ; preds = %69
br label %81
81: ; preds = %80, %59
%82 = load i32, i32* %4
%83 = add nsw i32 %82, 6
store i32 %83, i32* %4
br label %31
84: ; preds = %31
%85 = load i32, i32* %3
%86 = sext i32 %85 to i64
ret i64 %86
}

LLVM IR (-O2):
define i64 @triptych(i64 %0) {
%2 = and i64 %0, 1
%3 = icmp eq i64 %2, 0
br i1 %3, label %4, label %9
4: ; preds = %1, %4
%5 = phi i64 [ %6, %4 ], [ %0, %1 ]
%6 = sdiv i64 %5, 2
%7 = and i64 %6, 1
%8 = icmp eq i64 %7, 0
br i1 %8, label %4, label %9
9: ; preds = %4, %1
%10 = phi i64 [ %0, %1 ], [ %6, %4 ]
%11 = phi i32 [ 0, %1 ], [ 2, %4 ]
%12 = srem i64 %10, 3
%13 = icmp eq i64 %12, 0
br i1 %13, label %14, label %22
14: ; preds = %9
%15 = and i64 %10, 1
%16 = icmp eq i64 %15, 0
br i1 %16, label %17, label %22
17: ; preds = %14, %17
%18 = phi i64 [ %19, %17 ], [ %10, %14 ]
%19 = sdiv i64 %18, 3
%20 = and i64 %19, 1
%21 = icmp eq i64 %20, 0
br i1 %21, label %17, label %22
22: ; preds = %17, %14, %9
%23 = phi i64 [ %10, %9 ], [ %10, %14 ], [ %19, %17 ]
%24 = phi i32 [ %11, %9 ], [ 3, %14 ], [ 3, %17 ]
%25 = icmp slt i64 %23, 5
br i1 %25, label %58, label %26
26: ; preds = %22, %52
%27 = phi i64 [ %55, %52 ], [ 6, %22 ]
%28 = phi i64 [ %56, %52 ], [ 5, %22 ]
%29 = phi i32 [ %54, %52 ], [ %24, %22 ]
%30 = phi i64 [ %53, %52 ], [ %23, %22 ]
%31 = trunc i64 %28 to i32
%32 = srem i64 %30, %28
%33 = icmp eq i64 %32, 0
br i1 %33, label %34, label %39
34: ; preds = %26, %34
%35 = phi i64 [ %36, %34 ], [ %30, %26 ]
%36 = sdiv i64 %35, %28
%37 = srem i64 %36, %28
%38 = icmp eq i64 %37, 0
br i1 %38, label %34, label %39
39: ; preds = %34, %26
%40 = phi i64 [ %30, %26 ], [ %36, %34 ]
%41 = phi i32 [ %29, %26 ], [ %31, %34 ]
%42 = or i64 %27, 1
%43 = srem i64 %40, %42
%44 = icmp eq i64 %43, 0
br i1 %44, label %45, label %52
45: ; preds = %39
%46 = trunc i64 %42 to i32
br label %47
47: ; preds = %45, %47
%48 = phi i64 [ %49, %47 ], [ %40, %45 ]
%49 = sdiv i64 %48, %42
%50 = srem i64 %49, %42
%51 = icmp eq i64 %50, 0
br i1 %51, label %47, label %52
52: ; preds = %47, %39
%53 = phi i64 [ %40, %39 ], [ %49, %47 ]
%54 = phi i32 [ %41, %39 ], [ %46, %47 ]
%55 = add nuw i64 %27, 6
%56 = add nuw nsw i64 %27, 5
%57 = icmp slt i64 %53, %56
br i1 %57, label %58, label %26
58: ; preds = %52, %22
%59 = phi i32 [ %24, %22 ], [ %54, %52 ]
%60 = sext i32 %59 to i64
ret i64 %60
}