วรรณะ


9

ตัวเลขที่ไม่สามารถแตะต้องได้α

ตัวเลขที่ไม่สามารถแตะต้องได้คือจำนวนเต็มบวกที่ไม่สามารถแสดงเป็นผลรวมของตัวหารที่เหมาะสมทั้งหมดของจำนวนเต็มบวกใด ๆ (รวมถึงตัวเลขที่ไม่สามารถแตะได้เอง)

ตัวอย่างเช่นหมายเลข 4 ไม่สามารถแตะต้องได้เนื่องจากเท่ากับผลรวมของตัวหารที่เหมาะสมของ 9: 1 + 3 = 4 หมายเลข 5 ไม่สามารถแตะต้องได้เนื่องจากไม่ใช่ผลรวมของตัวหารที่เหมาะสมของจำนวนเต็มบวกใด ๆ 5 = 1 + 4 เป็นวิธีเดียวที่จะเขียน 5 เป็นผลรวมของจำนวนเต็มบวกที่แตกต่างกันรวมถึง 1 แต่ถ้า 4 หารตัวเลข 2 ก็เช่นกันดังนั้น 1 + 4 จึงไม่สามารถเป็นผลรวมของตัวหารที่เหมาะสมของจำนวนใด ๆ (ตั้งแต่ รายการปัจจัยจะต้องมีทั้ง 4 และ 2)

เชื่อกันว่าหมายเลข 5 เป็นหมายเลขที่ไม่สามารถแตะได้ แต่ก็ยังไม่ได้รับการพิสูจน์: มันจะตามมาจากการคาดเดาของ Goldbach ที่แข็งแกร่งขึ้นเล็กน้อย β

มีตัวเลขที่ไม่สามารถแตะต้องได้จำนวนมากความจริงที่พิสูจน์โดย Paul Erd's

คุณสมบัติบางอย่างของวรรณะ:

  • ไม่มีใครแตะต้องได้คือ 1 ยิ่งใหญ่กว่านายก
  • ไม่มีใครแตะต้องได้คือ 3 ยิ่งใหญ่กว่านายกยกเว้น 5
  • ไม่มีใครแตะต้องได้เป็นจำนวนที่สมบูรณ์แบบ
  • ถึงตอนนี้จัณฑาลทั้งหมดที่นอกเหนือจาก 2 และ 5 เป็นคอมโพสิต

วัตถุประสงค์

สร้างโปรแกรมหรือฟังก์ชั่นที่รับค่าตัวเลขธรรมชาติnผ่านพารามิเตอร์อินพุตหรือฟังก์ชันมาตรฐานและพิมพ์nหมายเลขที่ไม่สามารถแตะได้แรก

ผลลัพธ์จะต้องมีการแยกระหว่างตัวเลข แต่สามารถเป็นอะไรก็ได้ (เช่นขึ้นบรรทัดใหม่เครื่องหมายจุลภาคช่องว่าง ฯลฯ )

1 <= n <= 8153นี้ควรจะเป็นความสามารถในการทำงานอย่างน้อย นี้อยู่บนพื้นฐานความจริงที่ว่า B-ไฟล์ที่จัดไว้ให้สำหรับรายการ OEIS γn = 8153จะไปถึง

ช่องโหว่มาตรฐานไม่ได้รับอนุญาตตามปกติ

ตัวอย่าง 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

นี่คือ ดังนั้นอย่างน้อยจำนวนไบต์ที่ชนะ


α - Wikipedia , β - MathWorld , γ - OEIS


ด้วยเหตุผลบางอย่างสิ่งนี้ถูกทำเครื่องหมายว่าซ้ำกับคำถาม 'การค้นหาหมายเลขเซมิเพอร์เฟค' อย่างไรก็ตามงานมีความแตกต่างอย่างสิ้นเชิง ในกรณีนี้คุณต้องตรวจสอบเพื่อให้แน่ใจว่าไม่มีตัวหารที่สมบูรณ์แบบของจำนวนธรรมชาติใด ๆ สามารถเท่ากับจำนวนหนึ่งได้


นี่เป็นการเก็งกำไรอย่างแท้จริงเนื่องจากฉันยังไม่ได้คิดจริงๆว่าฉันจะแก้ปัญหานี้ยังไง: มันจะเป็นการโกงหรือไม่ถ้าฉันสันนิษฐานว่าขีด จำกัด สูงสุดของจำนวนผลลัพธ์ พูดว่าถ้าฉันเขียนโค้ดที่พบตัวเลขที่ไม่สามารถแตะได้สูงสุด 60,000 นั่นจะเพียงพอที่จะครอบคลุมช่วงอินพุต แต่แน่นอนฉันรู้ว่าขึ้นอยู่กับผลลัพธ์บางส่วนที่คุณให้
Reto Koradi

ฉันเดาว่าคงจะโอเค มันไม่ใช่เทคนิคการเข้ารหัสแบบฮาร์ดโค้ดไม่ละเมิดช่องโหว่มาตรฐานเท่าที่ฉันรู้ ตราบใดที่มันเหมาะกับสเป็คที่เหลือที่จะดี
Kade

@ วิหารไม่แน่นอน
Kade

คำตอบ:


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

โดยพื้นฐานแล้วมันดุร้ายที่สุดเท่าที่จะเป็นไปได้ทดสอบ factorizations จนถึงจำนวนที่มีความเหงายกกำลังสองบวกหนึ่ง


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 นาทีและต้องการ ~ 7GB (ไม่ขึ้นกับ 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--
        }
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.