Bất khả xâm phạm


9

Số không thể chạm tới α

Một số không thể chạm tới là một số nguyên dương không thể được biểu thị bằng tổng của tất cả các ước số thích hợp của bất kỳ số nguyên dương nào (bao gồm cả số không thể chạm tới được).

Ví dụ, số 4 không thể chạm tới được vì nó bằng tổng các ước số thích hợp của 9: 1 + 3 = 4. Số 5 không thể chạm tới vì nó không phải là tổng của các ước số thích hợp của bất kỳ số nguyên dương nào. 5 = 1 + 4 là cách duy nhất để viết 5 là tổng của các số nguyên dương khác biệt bao gồm 1, nhưng nếu 4 chia một số thì 2 cũng vậy, vì vậy 1 + 4 không thể là tổng của tất cả các ước số thích hợp của bất kỳ số nào (vì danh sách các yếu tố sẽ phải chứa cả 4 và 2).

Số 5 được cho là số lẻ duy nhất không thể chạm tới, nhưng điều này chưa được chứng minh: nó sẽ xuất phát từ một phiên bản mạnh hơn một chút của phỏng đoán Goldbach. β

Có vô số con số không thể chạm tới, một thực tế đã được chứng minh bởi Paul Erdős.

Một vài thuộc tính của không thể chạm tới:

  • Không thể chạm tới là 1 lớn hơn số nguyên tố
  • Không thể chạm tới là 3 lớn hơn một số nguyên tố, ngoại trừ 5
  • Không thể chạm tới là một con số hoàn hảo
  • Cho đến nay, tất cả các bất khả xâm phạm ngoài 2 và 5 là tổng hợp.

Mục tiêu

Tạo một chương trình hoặc hàm lấy số tự nhiên nthông qua đầu vào tiêu chuẩn hoặc tham số hàm và in các nsố không thể chạm tới đầu tiên .

Đầu ra phải có sự phân tách giữa các số, nhưng đây có thể là bất cứ thứ gì (ví dụ: dòng mới, dấu phẩy, dấu cách, v.v.).

Điều này sẽ có thể làm việc ít nhất 1 <= n <= 8153. Điều này dựa trên thực tế là tệp b được cung cấp cho mục nhập OEIS γ đi lên n = 8153.

Các sơ hở tiêu chuẩn không được phép, như thường lệ.

Ví dụ I / O

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

Đây là , vì vậy số byte ít nhất sẽ thắng.


α - Wikipedia , β - MathWorld , γ - OEIS


Vì một số lý do, điều này được đánh dấu là trùng lặp với câu hỏi 'tìm số bán chính xác', tuy nhiên các nhiệm vụ hoàn toàn khác nhau. Trong trường hợp này, bạn phải kiểm tra để đảm bảo rằng không có tổng các ước số hoàn hảo của bất kỳ số tự nhiên nào có thể bằng một số nhất định.


Đây hoàn toàn là suy đoán, vì tôi chưa thực sự nghĩ về cách tôi sẽ giải quyết vấn đề này: Sẽ là gian lận nếu tôi giả sử giới hạn trên cho các số kết quả? Nói, nếu tôi viết mã chỉ tìm thấy số không thể chạm tới 60.000? Điều đó là đủ để bao gồm phạm vi đầu vào. Nhưng tất nhiên tôi chỉ biết rằng dựa trên kết quả một phần bạn cung cấp.
Reto Koradi

Tôi đoán nó sẽ ổn thôi. Đó không phải là kỹ thuật mã hóa kết quả, không vi phạm các sơ hở tiêu chuẩn theo như tôi biết. Miễn là nó phù hợp với phần còn lại của thông số kỹ thuật sẽ ổn.
Kade

@vihan Chắc chắn là không.
Kade

Câu trả lời:


6

Bình thường, 21 byte

.f!fqZsf!%TYStTSh^Z2Q

Cảnh báo: Cực kỳ chậm. Chạy thử và thời gian dưới đây.

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

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

Về cơ bản, đó là lực lượng vũ phu nhất có thể, kiểm tra các yếu tố lên đến số cô đơn tiềm năng bình phương cộng với một.


4

C, 104 byte

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));}

Sẽ mất vài phút cho y > 20, nhưng bất cứ điều gì.


2

Java, 310 byte

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;}}

Chơi golf tốt nhất có thể nhưng tôi quan tâm nhiều hơn đến việc đảm bảo nó chạy trong thời gian hợp lý. Phiên bản không được yêu thích có lẽ thú vị hơn

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

Đi, 396 byte

Không thực sự chơi gôn, nhưng nó có thể làm tất cả các phạm vi cần thiết. Chạy trong khoảng ~ 20 phút và cần ~ 7GB (không phụ thuộc vào n). Tạo một mảng khổng lồ để tính tổng các ước cho tất cả các số có tới bình phương là 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--
        }
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.