В теории чисел нарциссическое число [1] [2] (также известное как плюсквамперфектный цифровой инвариант ( PPDI ) [3] число Армстронга [4] (в честь Майкла Ф. Армстронга) [5] или плюсовое совершенное число ) [6] в данной системе счисления — это число, которое является суммой своих собственных цифр, каждая из которых возведена в степень количества цифр.
Пусть будет натуральным числом. Определим нарциссическую функцию для базы следующим образом:
где - количество цифр в числе в базе , а
— значение каждой цифры числа. Натуральное число является нарциссическим числом, если оно является фиксированной точкой для , что происходит, если . Натуральные числа являются тривиальными нарциссическими числами для всех , все остальные нарциссические числа являются нетривиальными нарциссическими числами .
Например, число 153 по основанию является нарциссическим числом, потому что и .
Натуральное число является общительным нарциссическим числом, если оно является периодической точкой для , где для положительного целого числа (здесь - -я итерация ) , и образует цикл с периодом . Нарциссическое число является общительным нарциссическим числом с , а дружественное нарциссическое число является общительным нарциссическим числом с .
Все натуральные числа являются предпериодическими точками для , независимо от основания. Это происходит потому, что для любого заданного количества цифр минимально возможное значение равно , максимально возможное значение равно , а значение нарциссической функции равно . Таким образом, любое нарциссическое число должно удовлетворять неравенству . Умножая все стороны на , получаем , или, что эквивалентно, . Поскольку , это означает, что будет максимальное значение , где , из-за экспоненциальной природы и линейности . За пределами этого значения , всегда. Таким образом, существует конечное число нарциссических чисел, и любое натуральное число гарантированно достигнет периодической точки или фиксированной точки, меньшей , что делает его предпериодической точкой. Установка равной 10 показывает, что наибольшее нарциссическое число в основании 10 должно быть меньше . [1]
Число итераций, необходимых для достижения фиксированной точки, является устойчивостью нарциссической функции и не определено, если она никогда не достигает фиксированной точки.
База имеет по крайней мере одно двузначное нарциссическое число тогда и только тогда, когда не является простым числом, а количество двузначных нарциссических чисел в базе равно , где — количество положительных делителей числа .
Каждая база , которая не кратна девяти, имеет по крайней мере одно трехзначное нарциссическое число. Базы, которые не являются
В десятичной системе счисления всего 88 нарциссических чисел, из которых самое большое —
с 39 цифрами. [1]
Все числа представлены в системе счисления с основанием . «#» — длина каждой известной конечной последовательности.
Нарциссические числа | # | Циклы | Последовательность(и) OEIS | |
---|---|---|---|---|
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 | А010344 и А010343 | |
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 | А010346 |
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 | А010348 |
7 | 0, 1, 2, 3, 4, 5, 6, 13, 34, 44, 63, 250, 251, 305, 505, 12205, 12252, 13350, 13351, 15124, 36034, 205145, 1424553, 143355 4, 3126542, 4355653, 6515652, 125543055, ... | 60 | А010350 | |
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 | А010354 и А010351 | |
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 | А010353 | |
10 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407, 1634, 8208, 9474, 54748, 92727, 93084, 548834, ... | 88 | А005188 | |
11 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, А, 56, 66, 105, 307, 708, 966, А06, А64, 8009, 11720, 11721, 12470, ... | 135 | А0161948 | |
12 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, А, Б, 25, А5, 577, 668, А83, 14765, 938А4, 369862, А2394А, ... | 88 | А161949 | |
13 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, А, В, С, 14, 36, 67, 77, А6, С4, 490, 491, 509, В85, 3964, 22593, 5В350, ... | 202 | А0161950 | |
14 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, А, Б, В, Г, 136, 409, 74AB5, 153A632, ... | 103 | А0161951 | |
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 | А0161952 | |
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, С84Е1, ... | 294 | А161953 |
Нарциссические числа можно расширить до отрицательных целых чисел, используя знаковое цифровое представление для представления каждого целого числа.
В приведенном ниже примере реализована нарциссическая функция, описанная в определении выше, для поиска нарциссических функций и циклов в 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 totaldef ppdif_cycle ( x , b ): seen = [] пока x не в seen : seen . append ( x ) x = ppdif ( x , b ) cycle = [] пока x не в cycle : cycle . append ( x ) x = ppdif ( x , b ) return cycle
Следующая программа на Python определяет, является ли введенное целое число числом нарциссизма/Армстронга или нет.
def no_of_digits ( num ): i = 0 while num > 0 : num //= 10 i += 1 вернуть яdef required_sum ( num ): i = no_of_digits ( num ) s = 0 пока число > 0 : цифра = число % 10 число //= 10 с += сила ( цифра , i ) вернуть сnum = int ( input ( "Введите число:" )) s = required_sum ( num ) если s == num : print ( "Число Армстронга" ) иначе : print ( "Не число Армстронга" )
Следующая программа на Java определяет, является ли введенное целое число числом нарциссизма/Армстронга или нет.
импорт java.util.Scanner ; публичный класс ArmstrongNumber { public static void main ( String [ ] args ) { Scanner in = new Scanner ( System.in ) ; System.out.println ( " Введите положительное целое число : " ) ; int number = in.nextInt ( ) ; if ( isArmstrongNumber ( number )) { System . out . println ( number + " является числом Армстронга." ); } else { System . out . println ( number + " не является числом Армстронга." ); } } public static boolean isArmstrongNumber ( int number ) { int sum = 0 ; String numberString = Integer.toString ( number ) ; int numberOfDigits = numberString.length ( ) ; для ( int i = 0 ; i < numberOfDigits ; i ++ ) { int digit = Character . getNumericValue ( numberString . charAt ( i )); sum += Math . pow ( digit , numberOfDigits ); } вернуть сумму == число ; } }
Следующая программа на языке C# определяет, является ли введенное целое число числом нарциссизма/Армстронга или нет.
с использованием Системы ; public class Program { public static void Main () { Console.WriteLine ( " Введите число:" ) ; int value = int.Parse ( Console.ReadLine ( ) ) ; if ( value == RequiredSum ( value )) { Console . WriteLine ( "Число Армстронга" ); } else { Console . WriteLine ( "Не число Армстронга" ); } } private static int CountDigits ( int num ) { int i = 0 ; for (; num > 0 ; ++ i ) num /= 10 ; вернуть 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 ; } вернуть сумму ; } }
Следующая программа на языке C определяет, является ли введенное целое число числом нарциссизма/Армстронга или нет.
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> int getNumberOfDigits ( int n ); bool isArmstrongNumber ( int candidate ); int main () { int userNumber = 0 ; printf ( "Введите число, чтобы проверить, является ли оно числом Армстронга: " ); scanf ( "%d" , & userNumber ); printf ( "Является ли %d числом Армстронга?: %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++ определяет, является ли введенное целое число числом нарциссизма/Армстронга или нет.
#include <iostream> #include <cmath> bool isArmstrong ( int n ) { //Функция floor избыточна, поскольку log10(n) + 1 всегда будет целым числом, если n положительно. Достаточно просто использовать static_cast<int>(log10(n)) + 1. //int digits = floor(log10(n) + 1); //математическая формула для поиска количества цифр в числе с любым основанием 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 ; если ( isArmstrong ( n )) std :: cout << n << " является нарциссическим числом \n " ; иначе std :: cout << n << " не является нарциссическим числом \n " ; }
Следующая программа на Ruby определяет, является ли введенное целое число числом нарциссизма/Армстронга или нет.
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 определяет, является ли введенное целое число числом нарциссизма/Армстронга или нет.
функция нарциссический ( число ) { const numString = number . toString (); const numDigits = numString . length ; пусть сумма = 0 ; для ( пусть цифра из numString ) { сумма += Math . pow ( parseInt ( цифра ), numDigits ); } вернуть сумму === число ; }
Следующая программа Rust выводит все числа Нарциссизма/Армстронга от 0 до 100 миллионов в десятичной системе счисления.
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}" ) } }) }