Недоторканні


9

Недоторкані числа α

Недоторкане число - це додатне ціле число, яке не може бути виражене сумою всіх належних дільників будь-якого додатного цілого числа (включаючи саме недоторкане число).

Наприклад, число 4 не є недоторканим, оскільки воно дорівнює сумі власних дільників 9: 1 + 3 = 4. Число 5 недоторканне, оскільки воно не є сумою правильних дільників будь-якого додатного цілого числа. 5 = 1 + 4 - єдиний спосіб записати 5 як суму різних натуральних чисел, включаючи 1, але якщо 4 ділить число, 2 також, тож 1 + 4 не може бути сумою всіх належних дільників будь-якого числа (оскільки перелік факторів повинен містити і 4, і 2).

Вважається, що число 5 є єдиним непарним недоторканим числом, але це не було доведено: це випливає з дещо сильнішої версії гіпотези Гольдбаха. β

Є нескінченно багато чисел, що було доведено Полом Ердом.

Кілька властивостей недоторканих:

  • Жоден недоторканий не на 1 більший від простого
  • Жоден недоторканий не на 3 більше, ніж просто, крім 5
  • Жоден недоторканий не є ідеальним числом
  • На сьогоднішній день всі недоторканні, окрім 2 та 5, є складовими.

Об'єктивна

Створіть програму або функцію, яка приймає натуральне число nза допомогою стандартних вхідних або функціональних параметрів і друкує перші nнедоторкані числа.

Вихід повинен мати розділення між числами, але це може бути будь-що (тобто нові рядки, коми, пробіли тощо).

Це має бути здатним принаймні працювати 1 <= n <= 8153. Це засновано на тому факті , що б-файл , передбаченому для вступу OEIS γ йде до n = 8153.

Стандартні лазівки заборонено, як зазвичай.

Приклад вводу / виводу

1    -> 2
2    -> 2, 5
4    -> 2, 5, 52, 88
10   -> 2, 5, 52, 88, 96, 120, 124, 146, 162, 188
8153 -> 2, 5, 52, 88, 96, 120, ..., ..., ..., 59996

Це є , тому виграє найменша кількість байтів.


α - Вікіпедія , β - MathWorld , γ - OEIS


Чомусь це було позначено як дублікат на питання "знаходження напівдосконалих чисел", однак завдання зовсім інші. У цьому випадку потрібно перевірити, щоб жодна сума досконалих дільників будь-якого натурального числа не могла дорівнювати певній кількості.


Це суто спекулятивно, оскільки я ще не дуже думав над тим, як би це вирішити: чи було б обманом, якби я припустив верхню межу отриманих чисел? Скажіть, якщо я написав код, який знаходить лише недоторкані числа до 60 000? Цього буде достатньо, щоб покрити вхідний діапазон. Але я, звичайно, знаю лише те, що ви базуєтесь на наданих вами часткових результатах.
Рето Кораді

Я думаю, це було б добре. Це технічно не є жорстким кодуванням результатів, не порушує стандартні лазівки, наскільки я знаю. Поки він підходить до решти специфікацій, це буде добре.
Каде

@vihan Однозначно ні.
Каде

Відповіді:


6

Pyth, 21 байт

.f!fqZsf!%TYStTSh^Z2Q

Попередження: Неймовірно повільно. Нижче наведено тестовий пробіг та терміни.

$ time pyth -c '.f!fqZsf!%TYStTSh^Z2Q' <<< 3
[2, 5, 52]

real    2m46.463s
user    2m46.579s
sys 0m0.004s

Це в основному якомога грубіша сила, випробовує факторизацію до потенційного одинокого числа в квадраті плюс один.


4

C, 104 байти

j,i,z,w;u(y){for(z=2;y;z++)for(w=0;(++w<z*z||0&printf("%i ",z)+y--)&&j^z;)for(i=j=0;++i<w;j+=i*!(w%i));}

Це займе кілька хвилин для y > 20, але як би там не було.


2

Java, 310 байт

class U{int[] p;U(int e){p=new int[(int)4e9];for(int i=1,c=0;c<e;i++)if(u(i)>0){System.out.println(i);c++;}}int p(int n){if(p[n]!=0)return p[n];int i,s=1;for(i=2;i<=n-1;i++)s+=n%i==0?i+(n/i!=i?n/i:0):0;return(p[n]=s);}int u(int n){if(n==1)return 0;for(int i=2;i<=(n-1)*(n-1);i++)if(p(i)==n)return 0;return 1;}}

Гольф, як я міг, але я був більш зацікавлений, щоб переконатися, що він пробіг у розумні строки. Невідома версія, напевно, цікавіша

public class Untouchable {
    int[] properDivisorSumMap;


    public Untouchable(int estimatedMaxium){
        properDivisorSumMap = new int[(estimatedMaxium-1)*(estimatedMaxium-1)];
    }


    public int properDivisorSum(int n){
        if(properDivisorSumMap[n] != 0){
            return properDivisorSumMap[n];
        }

        int sum = 1;
        for(int i=2;i<=(int)Math.sqrt(n);i++){
            if(n%i==0){
                sum+=i;
                if(n/i != i){
                    sum+=n/i;
                }
            }
        }
        properDivisorSumMap[n] = sum;
        return sum;
    }


    public boolean untouchable(int n){
        if(n==1){
            return false;
        }
        for(int i=2;i<=(n-1)*(n-1);i++){
            if(properDivisorSum(i) == n){
                return false;
            }
        } 
        return true;
    }


    public static void main(String[] args){
        Untouchable test = new Untouchable(8480);

        int elements = Integer.parseInt(args[0]);

        for(int i=1,count=0;count < elements;i++){
            if(test.untouchable(i)){
                System.out.printf("%4d: %4d%n",count,i);
                count++;
            }
        }
    }
}

1

Ідіть, 396 байт

Насправді не в гольф, але він може виконати всі необхідні дальності. Працює близько ~ 20 хв і потребує ~ 7 Гб (незалежно від n). Створює гігантський масив для обчислення суми дільників для всіх чисел до 59997 у квадраті.

func untouchable(n int) {
    const C = 59997
    const N = C * C
    s := make([]uint16, N)
    for d := 1; d < N; d++ {
        for i := 2 * d; i < N; i += d {
            v := int(s[i]) + d
            if v > C {
                v = C + 1 // saturate at C+1
            }
            s[i] = uint16(v)
        }
    }
    var m [C]bool
    for i := 2; i < N; i++ {
        if s[i] < C {
            m[s[i]] = true
        }
    }
    for i := 2; n > 0; i++ {
        if !m[i] {
            println(i)
            n--
        }
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.