In number theory, a narcissistic number[1][2] (also known as a pluperfect digital invariant (PPDI),[3] an Armstrong number[4] (after Michael F. Armstrong)[5] or a plus perfect number)[6] in a given number base is a number that is the sum of its own digits each raised to the power of the number of digits.
Definition
editLet be a natural number. We define the narcissistic function for base to be the following:
where is the number of digits in the number in base , and
is the value of each digit of the number. A natural number is a narcissistic number if it is a fixed point for , which occurs if . The natural numbers are trivial narcissistic numbers for all , all other narcissistic numbers are nontrivial narcissistic numbers.
For example, the number 153 in base is a narcissistic number, because and .
A natural number is a sociable narcissistic number if it is a periodic point for , where for a positive integer (here is the th iterate of ), and forms a cycle of period . A narcissistic number is a sociable narcissistic number with , and an amicable narcissistic number is a sociable narcissistic number with .
All natural numbers are preperiodic points for , regardless of the base. This is because for any given digit count , the minimum possible value of is , the maximum possible value of is , and the narcissistic function value is . Thus, any narcissistic number must satisfy the inequality . Multiplying all sides by , we get , or equivalently, . Since , this means that there will be a maximum value where , because of the exponential nature of and the linearity of . Beyond this value , always. Thus, there are a finite number of narcissistic numbers, and any natural number is guaranteed to reach a periodic point or a fixed point less than , making it a preperiodic point. Setting equal to 10 shows that the largest narcissistic number in base 10 must be less than .[1]
The number of iterations needed for to reach a fixed point is the narcissistic function's persistence of , and undefined if it never reaches a fixed point.
A base has at least one two-digit narcissistic number if and only if is not prime, and the number of two-digit narcissistic numbers in base equals , where is the number of positive divisors of .
Every base that is not a multiple of nine has at least one three-digit narcissistic number. The bases that do not are
- 2, 72, 90, 108, 153, 270, 423, 450, 531, 558, 630, 648, 738, 1044, 1098, 1125, 1224, 1242, 1287, 1440, 1503, 1566, 1611, 1620, 1800, 1935, ... (sequence A248970 in the OEIS)
There are only 88 narcissistic numbers in base 10, of which the largest is
- 115,132,219,018,763,992,565,095,597,973,971,522,401
with 39 digits.[1]
Narcissistic numbers and cycles of Fb for specific b
editAll numbers are represented in base . '#' is the length of each known finite sequence.
Narcissistic numbers | # | Cycles | OEIS sequence(s) | |
---|---|---|---|---|
2 | 0, 1 | 2 | ||
3 | 0, 1, 2, 12, 22, 122 | 6 | ||
4 | 0, 1, 2, 3, 130, 131, 203, 223, 313, 332, 1103, 3303 | 12 | A010344 and A010343 | |
5 | 0, 1, 2, 3, 4, 23, 33, 103, 433, 2124, 2403, 3134, 124030, 124031, 242423, 434434444, ... | 18 |
1234 → 2404 → 4103 → 2323 → 1234 3424 → 4414 → 11034 → 20034 → 20144 → 31311 → 3424 1044302 → 2110314 → 1044302 1043300 → 1131014 → 1043300 |
A010346 |
6 | 0, 1, 2, 3, 4, 5, 243, 514, 14340, 14341, 14432, 23520, 23521, 44405, 435152, 5435254, 12222215, 555435035 ... | 31 |
44 → 52 → 45 → 105 → 330 → 130 → 44 13345 → 33244 → 15514 → 53404 → 41024 → 13345 14523 → 32253 → 25003 → 23424 → 14523 2245352 → 3431045 → 2245352 12444435 → 22045351 → 30145020 → 13531231 → 12444435 115531430 → 230104215 → 115531430 225435342 → 235501040 → 225435342 |
A010348 |
7 | 0, 1, 2, 3, 4, 5, 6, 13, 34, 44, 63, 250, 251, 305, 505, 12205, 12252, 13350, 13351, 15124, 36034, 205145, 1424553, 1433554, 3126542, 4355653, 6515652, 125543055, ... | 60 | A010350 | |
8 | 0, 1, 2, 3, 4, 5, 6, 7, 24, 64, 134, 205, 463, 660, 661, 40663, 42710, 42711, 60007, 62047, 636703, 3352072, 3352272, ... | 63 | A010354 and A010351 | |
9 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 45, 55, 150, 151, 570, 571, 2446, 12036, 12336, 14462, 2225764, 6275850, 6275851, 12742452, ... | 59 | A010353 | |
10 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407, 1634, 8208, 9474, 54748, 92727, 93084, 548834, ... | 88 | A005188 | |
11 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, 56, 66, 105, 307, 708, 966, A06, A64, 8009, 11720, 11721, 12470, ... | 135 | A0161948 | |
12 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, 25, A5, 577, 668, A83, 14765, 938A4, 369862, A2394A, ... | 88 | A161949 | |
13 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, 14, 36, 67, 77, A6, C4, 490, 491, 509, B85, 3964, 22593, 5B350, ... | 202 | A0161950 | |
14 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, 136, 409, 74AB5, 153A632, ... | 103 | A0161951 | |
15 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, 78, 88, C3A, D87, 1774, E819, E829, 7995C, 829BB, A36BC, ... | 203 | A0161952 | |
16 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 156, 173, 208, 248, 285, 4A5, 5B0, 5B1, 60B, 64B, 8C0, 8C1, 99A, AA9, AC3, CA8, E69, EA0, EA1, B8D2, 13579, 2B702, 2B722, 5A07C, 5A47C, C00E0, C00E1, C04E0, C04E1, C60E7, C64E7, C80E0, C80E1, C84E0, C84E1, ... | 294 | A161953 |
Extension to negative integers
editNarcissistic numbers can be extended to the negative integers by use of a signed-digit representation to represent each integer.
Programming example
editPython
editThe example below implements the narcissistic function described in the definition above to search for narcissistic functions and cycles in Python.
def ppdif(x, b):
y = x
digit_count = 0
while y > 0:
digit_count = digit_count + 1
y = y // b
total = 0
while x > 0:
total = total + pow(x % b, digit_count)
x = x // b
return total
def ppdif_cycle(x, b):
seen = []
while x not in seen:
seen.append(x)
x = ppdif(x, b)
cycle = []
while x not in cycle:
cycle.append(x)
x = ppdif(x, b)
return cycle
The following Python program determines whether the integer entered is a Narcissistic / Armstrong number or not.
def no_of_digits(num):
i = 0
while num > 0:
num //= 10
i+=1
return i
def required_sum(num):
i = no_of_digits(num)
s = 0
while num > 0:
digit = num % 10
num //= 10
s += pow(digit, i)
return s
num = int(input("Enter number:"))
s = required_sum(num)
if s == num:
print("Armstrong Number")
else:
print("Not Armstrong Number")
Java
editThe following Java program determines whether the integer entered is a Narcissistic / Armstrong number or not.
import java.util.Scanner;
public class ArmstrongNumber {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Enter a positive integer: ");
int number = in.nextInt();
if (isArmstrongNumber(number)) {
System.out.println(number + " is an Armstrong number.");
} else {
System.out.println(number + " is not an Armstrong number.");
}
}
public static boolean isArmstrongNumber(int number) {
int sum = 0;
String numberString = Integer.toString(number);
int numberOfDigits = numberString.length();
for (int i = 0; i < numberOfDigits; i++) {
int digit = Character.getNumericValue(numberString.charAt(i));
sum += Math.pow(digit, numberOfDigits);
}
return sum == number;
}
}
C#
editThe following C# program determines whether the integer entered is a Narcissistic / Armstrong number or not.
using System;
public class Program
{
public static void Main()
{
Console.WriteLine("Enter the number:");
int value = int.Parse(Console.ReadLine());
if (value == RequiredSum(value))
{
Console.WriteLine("Armstrong Number");
}
else
{
Console.WriteLine("Not an Armstrong Number");
}
}
private static int CountDigits(int num)
{
int i = 0;
for (;num > 0; ++i) num /= 10;
return i;
}
private static int RequiredSum(int num)
{
int count = CountDigits(num);
int sum = 0;
while (num > 0)
{
sum += (int)Math.Pow(num % 10, count);
num /= 10;
}
return sum;
}
}
C
editThe following C program determines whether the integer entered is a Narcissistic / Armstrong number or not.
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int getNumberOfDigits(int n);
bool isArmstrongNumber(int candidate);
int main()
{
int userNumber = 0;
printf("Enter a number to verify if it is an Armstrong number: ");
scanf("%d", &userNumber);
printf("Is %d an Armstrong number?: %s\n", userNumber, isArmstrongNumber(userNumber) ? "true" : "false");
return 0;
}
bool isArmstrongNumber(int candidate)
{
int numberOfDigits = getNumberOfDigits(candidate);
int sum = 0;
for (int i = candidate; i != 0; i /= 10)
{
int num = i % 10;
int n = 1;
for (int j = 0; j < numberOfDigits; j++)
{
n *= num;
}
sum += n;
}
return sum == candidate;
}
int getNumberOfDigits(int n)
{
int sum = 0;
while (n != 0)
{
n /= 10;
++sum;
}
return sum;
}
C++
editThe following C++ program determines whether the Integer entered is a Narcissistic / Armstrong number or not.
#include <iostream>
#include <cmath>
bool isArmstrong(int n)
{
//The floor function is redundant because log10(n) + 1 will always be an integer when n is positive. Simply using static_cast<int>(log10(n)) + 1 would suffice.
//int digits = floor(log10(n) + 1); //math formula to find number of digits in a number with any base
int sum = 0;
if (n >= 0)
{
int digits = static_cast<int>(log10(n)) + 1;
for (int tmp = n; tmp; tmp /= 10) sum += pow(tmp%10, digits);
}
return sum == n;
}
int main()
{
int n = 407;
if(isArmstrong(n)) std::cout << n << " is a narcissistic number\n";
else std::cout << n << " is not a narcissistic number\n";
}
Ruby
editThe following Ruby program determines whether the integer entered is a Narcissistic / Armstrong number or not.
def narcissistic?(value) #1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153
nvalue = []
nnum = value.to_s
nnum.each_char do |num|
nvalue << num.to_i
end
sum = 0
i = 0
while sum <= value
nsum = 0
nvalue.each_with_index do |num,idx|
nsum += num ** i
end
if nsum == value
return true
else
i += 1
sum += nsum
end
end
return false
end
JavaScript
editThe following JavaScript program determines whether the integer entered is a Narcissistic / Armstrong number or not.
function narcissistic(number) {
const numString = number.toString();
const numDigits = numString.length;
let sum = 0;
for (let digit of numString) {
sum += Math.pow(parseInt(digit), numDigits);
}
return sum === number;
}
Rust
editThe following Rust program prints all the Narcissistic / Armstrong numbers from 0 to 100 million in base 10.
fn is_armstrong_number(num: u64) -> bool {
let digits = num.to_string();
digits
.chars()
.map(|x| (x as u64 - 0x30).pow(digits.len() as u32))
.sum::<u64>()
== num
}
fn main() {
(0..100_000_000).for_each(|n| {
if is_armstrong_number(n) {
println!("{n}")
}
})
}
See also
editReferences
edit- ^ a b c Weisstein, Eric W. "Narcissistic Number". MathWorld.
- ^ Perfect and PluPerfect Digital Invariants Archived 2007-10-10 at the Wayback Machine by Scott Moore
- ^ PPDI (Armstrong) Numbers by Harvey Heinz
- ^ Armstrong Numbers by Dik T. Winter
- ^ Lionel Deimel’s Web Log
- ^ (sequence A005188 in the OEIS)
- Joseph S. Madachy, Mathematics on Vacation, Thomas Nelson & Sons Ltd. 1966, pages 163-175.
- Rose, Colin (2005), Radical narcissistic numbers, Journal of Recreational Mathematics, 33(4), 2004–2005, pages 250-254.
- Perfect Digital Invariants by Walter Schneider
External links
edit- Digital Invariants
- Armstrong Numbers
- Armstrong Numbers in base 2 to 16
- Armstrong numbers between 1-999 calculator
- Symonds, Ria. "153 and Narcissistic Numbers". Numberphile. Brady Haran. Archived from the original on 2021-12-19.