Is it almost-prime?
Sagemath, 2 bytes
GF
Outputs via exception.
Try it online!
The Sagemath builtin \$\text{GF}\$ creates a Galois Field of order \$n\$. However, remember that \$\mathbb{F}_n\$ is only a field if \$n = p^k\$ where \$p\$ is a prime and \$k\$ a positive integer. Thus the function throws an exception if and only if its input is not a prime power.
Python 2, 42 bytes
f=lambda n,p=2:n%p and f(n,p+1)or p**n%n<1
Try it online!
Since Python doesn't have any built-ins for primes, we make do with checking divisibility.
We find the smallest prime p
that's a factor of n
by counting up p=2,3,4,...
until n
is divisible by p
, that is n%p
is zero. There, we check that this p
is the only prime factor by checking that a high power of p
is divisible by n
. For this, p**n
suffices.
As a program:
43 bytes
n=input()
p=2
while n%p:p+=1
print p**n%n<1
Try it online!
This could be shorter with exit codes if those are allowed.
46 bytes
lambda n:all(n%p for p in range(2,n)if p**n%n)
Try it online!
Shakespeare Programming Language, 329 bytes
,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]
Ajax:Listen tothy.
Page:You cat.
Scene V:.
Page:You is the sum ofYou a cat.
Is the remainder of the quotient betweenI you nicer zero?If soLet usScene V.
Scene X:.
Page:You is the cube ofYou.Is you worse I?If soLet usScene X.
You is the remainder of the quotient betweenYou I.Open heart
Try it online!
Outputs 0
if the input is almost prime, and a positive integer otherwise. I am not sure this is an acceptable output; changing it would cost a few bytes.
Explanation:
- Scene I:
Page
takes in input (call thisn
). InitializeAjax = 1
. - Scene V: Increment
Ajax
untilAjax
is a divisor ofPage
; call the final valuep
This gives the smallest divisor ofPage
, which is guaranteed to be a prime. - Scene X: Cube
Ajax
until you end up with a power ofp
, sayp^k
which is greater thann
. Thenn
is almost-prime iffn
dividesp^k
.