Narcissistic number
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
[edit]Let 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
[edit]All 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
[edit]Narcissistic numbers can be extended to the negative integers by use of a signed-digit representation to represent each integer.
Programming example
[edit]Python
[edit]The 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
[edit]The 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#
[edit]The 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
[edit]The 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++
[edit]The 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
[edit]The 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
[edit]The 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
[edit]The 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
[edit]- Arithmetic dynamics
- Dudeney number
- Factorion
- Happy number
- Kaprekar's constant
- Kaprekar number
- Meertens number
- Perfect digit-to-digit invariant
- Perfect digital invariant
- Sum-product number
References
[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.