August 26, 2024

P35 - Determine prime factors of a given positive integer.

Construct a list containing prime factors in ascending order.

> 315.primeFactors()
[3, 3, 5, 7]

kotlin

package org.kotlin99.arithmetic

import com.natpryce.hamkrest.assertion.assertThat
import com.natpryce.hamkrest.equalTo
import org.junit.Test

fun Int.primeFactors(): List<Int> {
    if (this.isPrime()) return listOf(this)

    val primeFactor = (2..(this / 2))
        .filter { it.isPrime() }
        .find { this % it == 0 }

    return if (primeFactor == null) emptyList()
    else listOf(primeFactor) + (this / primeFactor).primeFactors()
}

class P35Test {
    @Test fun `determine prime factors of a given positive integer`() {
        assertThat((2..10).map { Pair(it, it.primeFactors()) }, equalTo(listOf(
            Pair(2, listOf(2)),
            Pair(3, listOf(3)),
            Pair(4, listOf(2, 2)),
            Pair(5, listOf(5)),
            Pair(6, listOf(2, 3)),
            Pair(7, listOf(7)),
            Pair(8, listOf(2, 2, 2)),
            Pair(9, listOf(3, 3)),
            Pair(10, listOf(2, 5))
        )))
        assertThat(315.primeFactors(), equalTo(listOf(3, 3, 5, 7)))
    }
}
Be first to comment
Leave a reply