mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 02:27:43 +00:00
AK: Introduce IntegralMath.h starting with pow<I>
This commit is contained in:
parent
64f135d90f
commit
581c23dc55
3 changed files with 56 additions and 0 deletions
35
AK/IntegralMath.h
Normal file
35
AK/IntegralMath.h
Normal file
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Leon Albrecht <leon2002.la@gmail.com>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AK/Concepts.h>
|
||||
#include <AK/Types.h>
|
||||
|
||||
#include <AK/Format.h>
|
||||
|
||||
namespace AK {
|
||||
|
||||
template<Integral I>
|
||||
constexpr I pow(I base, I exponent)
|
||||
{
|
||||
// https://en.wikipedia.org/wiki/Exponentiation_by_squaring
|
||||
if (exponent < 0)
|
||||
return 0;
|
||||
if (exponent == 0)
|
||||
return 1;
|
||||
|
||||
I res = 1;
|
||||
while (exponent > 0) {
|
||||
if (exponent & 1)
|
||||
res *= base;
|
||||
base *= base;
|
||||
exponent /= 2u;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue