গণনা OEIS A005434


10

কাজটি সম্ভব OEIS A005434 যত তাড়াতাড়ি সম্ভব গণনা করা ।

Sদৈর্ঘ্যের একটি বাইনারি স্ট্রিং বিবেচনা করুন n। ইন্ডেক্স থেকে 1, আমরা যদি নির্ধারণ করতে পারেন S[1..i+1]ম্যাচ S[n-i..n]ঠিক সবার জন্য iথেকে অনুক্রমে 0করতে n-1। উদাহরণ স্বরূপ,

S = 01010

দেয়

[Y, N, Y, N, Y].

এ কারণে যে 0ম্যাচ 0, 01মিলছে না 10, 010ম্যাচ 010, 0101মিলছে না 1010 এবং পরিশেষে 01010নিজেই সাথে মেলে।

দৈর্ঘ্যের বিভিন্ন সম্ভাব্য বিট স্ট্রিংগুলিতে পুনরাবৃত্তি করার সময় s এবং s f(n)এর পৃথক অ্যারেগুলির সংখ্যা হতে সংজ্ঞায়িত করুন ।YN2^nSn

পর্যবেক্ষক লক্ষ্য করবেন যে এই প্রশ্নটি আমার আরেকটি সাম্প্রতিক প্রশ্নের সরল রূপ । তবে, আমি প্রত্যাশা করি যে চালাক কৌশলগুলি এটিকে আরও দ্রুত এবং সহজ করে তুলতে পারে।

কার্য

nশুরুতে বাড়ানোর জন্য 1, আপনার কোডটি আউটপুট করা উচিত n, f(n)

উদাহরণ উত্তর

কারণ n = 1..24, সঠিক উত্তরগুলি হ'ল:

1, 2, 3, 4, 6, 8, 10, 13, 17, 21, 27, 30, 37, 47, 57, 62, 75, 87, 102, 116, 135, 155, 180, 194

স্কোরিং

আপনার কোডটি n = 1প্রতিটি পরিবর্তে উত্তর দেওয়া থেকে পুনরুক্ত হওয়া উচিত n। আমি পুরো রান সময়টি করব, দুই মিনিট পরে এটি হত্যা করব।

আপনার স্কোর nসেই সময়ে আপনি সবচেয়ে বেশি পাবেন।

টাইয়ের ক্ষেত্রে প্রথম উত্তরটি জয়ী হয়।

আমার কোডটি কোথায় পরীক্ষা করা হবে?

আমি আপনার কোডটি ভার্চুয়ালবক্সের অধীনে লুবুন্টু অতিথি ভিএম (আমার উইন্ডোজ 7 হোস্টে) তে চালাব ।

আমার ল্যাপটপে 8 গিগাবাইট র‌্যাম এবং 2 টি কোর এবং 4 টি থ্রেড সহ একটি ইন্টেল i7 5600U@2.6 গিগাহার্টজ (ব্রডওয়েল) সিপিইউ রয়েছে। নির্দেশিকা সেটটিতে এসএসই 4.2, এভিএক্স, এভিএক্স 2, এফএমএ 3 এবং টিএসএক্স অন্তর্ভুক্ত রয়েছে।

প্রতি ভাষা প্রতি নেতৃস্থানীয় এন্ট্রি

  • এন = 599 মধ্যে মরচে Bu অ্যান্ডার্স Kaseorg।
  • এন = 30 মধ্যে সি ময়লা দ্বারা। স্থানীয়ভাবে সাইগউইনে চালিত হয়ে সমান্তরাল সংস্করণটি 32 এ চলে যায়।

math.uni-bielefeld.de/~sillke/SEQUENCES/autocorrelation-range.c (OEIS পৃষ্ঠার সাথে লিঙ্ক করা) -O3 দিয়ে চালানো আমার মেশিন <.02 সেকেন্ডের মধ্যে 100 পর্যন্ত নিরূপণ করতে পারেন
vroomfondel

@ আরোগোস ওহ প্রিয়। আমার প্রশ্নটি মুছে ফেলা উচিত তবে এর উত্তর ইতিমধ্যে আছে।

আমি মনে করি এটি এখনও একটি দুর্দান্ত সমস্যা - তবে এর পরিবর্তে সম্ভবত 1000 পর্যন্ত? বা গল্ফের জন্য পর্যাপ্ত দ্রুত প্রোগ্রামের উত্তর জিজ্ঞাসা করুন
ভোরফোনডেল

1
@ আরোগোস আমি সবেমাত্র হার্ড সীমাটি সরিয়ে দিয়েছি।

উত্তর:


4

মরিচা , এন ≈ 660

use std::collections::HashMap;
use std::iter::once;
use std::rc::Rc;

type Memo = HashMap<(u32, u32, Rc<Vec<u32>>), u64>;

fn f(memo: &mut Memo, mut n: u32, p: u32, mut s: Rc<Vec<u32>>) -> u64 {
    debug_assert!(p != 0);
    let d = n / p;
    debug_assert!(d >= 1);
    let r = n - p * if d >= 2 { d - 1 } else { 1 };

    let k = s.binary_search(&(n - r + 1)).unwrap_or_else(|i| i);
    for &i in &s[..k] {
        if i % p != 0 {
            return 0;
        }
    }

    if d >= 3 {
        let o = n - (p + r);
        n = p + r;
        s = Rc::new(s[k..].iter().map(|i| i - o).collect());
    } else if n == p {
        return 1;
    } else if k != 0 {
        s = Rc::new(s[k..].to_vec());
    }

    let query = (n, p, s);
    if let Some(&c) = memo.get(&query) {
        return c;
    }
    let (n, p, s) = query;

    let t = Rc::new(s.iter().map(|i| i - p).collect::<Vec<_>>());
    let c = if d < 2 {
        (1..r + 1).map(|q| f(memo, r, q, t.clone())).sum()
    } else if r == p {
        (1..p + 1)
            .filter(|&q| p % q != 0 || q == p)
            .map(|q| f(memo, r, q, t.clone()))
            .sum()
    } else {
        let t = match t.binary_search(&p) {
            Ok(_) => t,
            Err(k) => {
                Rc::new(t[..k]
                            .iter()
                            .cloned()
                            .chain(once(p))
                            .chain(t[k..].iter().cloned())
                            .collect::<Vec<_>>())
            }
        };
        (1..t.first().unwrap() + 1)
            .filter(|&q| p % q != 0 || q == p)
            .map(|q| f(memo, r, q, t.clone()))
            .sum()
    };
    memo.insert((n, p, s), c);
    c
}

fn main() {
    let mut memo = HashMap::new();
    let s = Rc::new(Vec::new());
    for n in 1.. {
        println!("{} {}",
                 n,
                 (1..n + 1)
                     .map(|p| f(&mut memo, n, p, s.clone()))
                     .sum::<u64>());
    }
}

এটি অনলাইন চেষ্টা করুন!

কিভাবে এটা কাজ করে

এটি লিও গুইবাস, "স্ট্রিংগুলিতে পিরিয়ডস " (1981) - এ দেওয়া পুনরাবৃত্ত প্রেরিকেটের একটি স্মৃতি বাস্তবায়ন । ফাংশনটি ক্ষুদ্রতম সময়ের সাথে f(memo, n, p, s)দৈর্ঘ্যের পারস্পরিক সম্পর্কের সংখ্যা এবং সেটের প্রতিটি পিরিয়ডের সন্ধান করে ।nps


অন্যান্য সম্পর্কিত সমস্যার দ্রুত সমাধান আছে কিনা তা অবাক করে তোলে। খুব চিত্তাকর্ষক!

মজার বিষয় হল এটি সম্পূর্ণ স্মৃতি সীমিত। এটি 500 ডলার পর্যন্ত গতিবেগ করে এবং র‌্যামের বাইরে চলে যাওয়ার সাথে সাথে হঠাৎ ধীর হয়ে যায়।

2

চ্যালেঞ্জটি শুরু করতে কেবল একটি সাধারণ উদ্দীপনা অনুসন্ধান:

#include <stdio.h>
#include <stdint.h>
#include <string.h>

typedef uint16_t u16;
typedef uint64_t u64;

static u64 map[1<<16];

int main(void)
{
    for (u64 n = 1;; ++n) {
        u64 result = 1;
        u64 mask = (1ul << n) - 1;
        memset(map, 0, sizeof(map));

        #pragma omp parallel
        #pragma omp for
        for (u64 x = 1ul << (n - 1); x < 1ul << n; ++x) {

            u64 r = 0;
            for (u64 i = 1; i < n; ++i)
                r |= (u64) (x >> i == (x & (mask >> i))) << i;
            if (!r)
                continue;

            u16 h = (u16) (r ^ r >> 13 ^ r >> 27);
            while (map[h] && map[h] != r)
                ++h;

            if (!map[h]) {
                #pragma omp critical
                if (!map[h]) {
                    map[h] = r;
                    ++result;
                }
            }
        }

        printf("%ld\n", result);
    }
}

সংকলন clang -fopenmp -Weverything -O3 -march=native। আমার মেশিনে এটি 2 মিনিটের মধ্যে n = 34 এ পৌঁছে যায়।

সম্পাদনা: সহজ সমান্তরালতার জন্য কিছু ওএমপি নির্দেশনা ছিটানো।


@ ল্যাম্বিক কি এসই মাঠের বাইরে মুছে ফেলার জন্য উত্তরের উত্তরের অস্তিত্ব? উত্তর হিসাবে এই অ্যালগরিদম জমা দেওয়ার জন্য কারও (সম্ভবত কমেন্টার) অপেক্ষা করা উচিত নয় এবং সেই উত্তরটি গ্রহণ করবেন?
গ্রিমি

আপনি খুব ভাল পয়েন্ট করেছেন

দুঃখজনকভাবে আমি সত্যিই ভার্চুয়ালবক্সে আপনার সমান্তরাল কোডটি পরীক্ষা করতে পারি না কারণ আমার সিপিইউতে আমার মোট দুটি কোর রয়েছে।

আমি এটি সাইগউইনে চালিয়েছি এবং এটি 32
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.