N এর সমষ্টিযুক্ত সমস্ত চার-স্কোয়ার সংমিশ্রণটি আমরা কত দ্রুত খুঁজে পেতে পারি?


12

স্ট্যাক ওভারফ্লোতে একটি প্রশ্ন জিজ্ঞাসা করা হয়েছিল ( এখানে ):

একটি পূর্ণসংখ্যার দেওয়া হয় , এবং এর পূর্ণসংখ্যার মানগুলির সমস্ত সম্ভাব্য সংমিশ্রণগুলি মুদ্রণ করুন যা সমীকরণটি সমাধান করে ।, বি , সি ডি 2 + বি 2 + সি 2 + ডি 2 = এনNA,B,CDA2+B2+C2+D2=N

এই প্রশ্নটি অবশ্যই সংখ্যা তত্ত্বের বাচেটের কনজেকচারের সাথে সম্পর্কিত (কখনও কখনও তার প্রমাণের কারণে ল্যাঞ্জ্রেজের ফোর স্কোয়ার উপপাদ্য হিসাবে ডাকা হয়)। কিছু কাগজপত্র রয়েছে যেগুলি একটি একক সমাধান কীভাবে সন্ধান করতে হয় তা নিয়ে আলোচনা করে তবে আমি কোনও নির্দিষ্ট জন্য সমস্ত সমাধান সন্ধান করতে পারি (যেটি, সমস্ত সংমিশ্রণ নয়, সমস্ত অনুক্রমের নয় ) এই বিষয়ে কথা বলে এমন কিছু খুঁজে পাচ্ছি না ।N

আমি এটি সম্পর্কে বেশ খানিকটা ভাবছিলাম এবং আমার কাছে মনে হয় এটি সময় এবং স্পেসে সমাধান করা যায়, যেখানে কাঙ্ক্ষিত যোগফল। তবে, বিষয়টিতে কোনও পূর্বের তথ্যের অভাব, আমি নিশ্চিত নই যে এটি আমার পক্ষ থেকে কোনও তাত্পর্যপূর্ণ দাবি বা কেবল একটি তুচ্ছ, স্পষ্ট বা ইতিমধ্যে পরিচিত ফলাফল কিনা।এনO(N)N

সুতরাং, তাহলে প্রশ্নটি হল, প্রদত্ত জন্য আমরা চার-স্কয়ার সমষ্টিগুলির কত দ্রুত খুঁজে পেতে পারি ?N


ঠিক আছে, এখানে (প্রায়) ও (এন) অ্যালগোরিদম যা আমি ভাবছিলাম। প্রথম দুটি সমর্থনকারী ফাংশন, নিকটতম পূর্ণসংখ্যার বর্গমূলের ফাংশন:

    // the nearest integer whose square is less than or equal to N
    public int SquRt(int N)
    {
        return (int)Math.Sqrt((double)N);
    }

এবং 0 থেকে N পর্যন্ত যোগফলের সমস্ত টুস্কয়ার জুড়ি ফেরত দেওয়ার জন্য একটি ফাংশন:

    // Returns a list of all sums of two squares less than or equal to N, in order.
    public List<List<int[]>> TwoSquareSumsLessThan(int N)
    {
        //Make the index array
        List<int[]>[] Sum2Sqs = new List<int[]>[N + 1];

        //get the base square root, which is the maximum possible root value
        int baseRt = SquRt(N);

        for (int i = baseRt; i >= 0; i--)
        {
            for (int j = 0; j <= i; j++)
            {
                int sum = (i * i) + (j * j);
                if (sum > N)
                {
                    break;
                }
                else
                {
                    //make the new pair
                    int[] sumPair = { i, j };
                    //get the sumList entry
                    List<int[]> sumLst;
                    if (Sum2Sqs[sum] == null)
                    {   
                        // make it if we need to
                        sumLst = new List<int[]>();
                        Sum2Sqs[sum] = sumLst;
                    }
                    else
                    {
                        sumLst = Sum2Sqs[sum];
                    }
                    // add the pair to the correct list
                    sumLst.Add(sumPair);
                }
            }
        }

        //collapse the index array down to a sequential list
        List<List<int[]>> result = new List<List<int[]>>();
        for (int nn = 0; nn <= N; nn++)
        {
            if (Sum2Sqs[nn] != null) result.Add(Sum2Sqs[nn]);
        }

        return result;
    }

অবশেষে, নিজেই অ্যালগরিদম:

    // Return a list of all integer quads (a,b,c,d), where:
    //      a^2 + b^2 + c^2 + d^2 = N,
    // and  a >= b >= c >= d,
    // and  a,b,c,d >= 0
    public List<int[]> FindAllFourSquares(int N)
    {
        // get all two-square sums <= N, in descending order
        List<List<int[]>> Sqr2s = TwoSquareSumsLessThan(N);

        // Cross the descending list of two-square sums <= N with
        // the same list in ascending order, using a Merge-Match
        // algorithm to find all combinations of pairs of two-square
        // sums that add up to N
        List<int[]> hiList, loList;
        int[] hp, lp;
        int hiSum, loSum;
        List<int[]> results = new List<int[]>();
        int prevHi = -1;
        int prevLo = -1;

        //  Set the Merge sources to the highest and lowest entries in the list
        int hi = Sqr2s.Count - 1;
        int lo = 0;

        //  Merge until done ..
        while (hi >= lo)
        {
            // check to see if the points have moved
            if (hi != prevHi)
            {
                hiList = Sqr2s[hi];
                hp = hiList[0];     // these lists cannot be empty
                hiSum = hp[0] * hp[0] + hp[1] * hp[1];
                prevHi = hi;
            }
            if (lo != prevLo)
            {
                loList = Sqr2s[lo];
                lp = loList[0];     // these lists cannot be empty
                loSum = lp[0] * lp[0] + lp[1] * lp[1];
                prevLo = lo;
            }

            // do the two entries' sums together add up to N?
            if (hiSum + loSum == N)
            {
                // they add up, so cross the two sum-lists over each other
                foreach (int[] hiPair in hiList)
                {
                    foreach (int[] loPair in loList)
                    {
                        // make a new 4-tuple and fill it
                        int[] quad = new int[4];
                        quad[0] = hiPair[0];
                        quad[1] = hiPair[1];
                        quad[2] = loPair[0];
                        quad[3] = loPair[1];

                        // only keep those cases where the tuple is already sorted
                        //(otherwise it's a duplicate entry)
                        if (quad[1] >= quad[2]) //(only need to check this one case, the others are implicit)
                        {
                            results.Add(quad);
                        }
                        //(there's a special case where all values of the 4-tuple are equal
                        // that should be handled to prevent duplicate entries, but I'm
                        // skipping it for now)
                    }
                }
                // both the HI and LO points must be moved after a Match
                hi--;
                lo++;
            }
            else if (hiSum + loSum < N)
            {
                lo++;   // too low, so must increase the LO point
            }
            else    // must be > N
            {
                hi--;   // too high, so must decrease the HI point
            }
        }
        return results;
    }

যেমনটি আমি আগেই বলেছি, এটি ও (এন) এর খুব কাছাকাছি হওয়া উচিত, তবে, যুয়াল ফিল্মাস উল্লেখ করেছেন যেহেতু N এর সাথে চার স্কোয়ার সলিউশন সংখ্যা ক্রম (N ln ln N) হতে পারে, তখন এই অ্যালগরিদম হতে পারে না তার চেয়ে কম


হ্যাঁ, এটি পোস্ট করুন। আমি এখনও লিনিয়ার অ্যালগোরিদমের বিবরণ বিকাশ করছি তবে আমি নিশ্চিত যে এটি বৈধ।
আরবেরি ইয়ং

5
রেকর্ডের জন্য, এটি উপস্থিত হয় যে কখনও কখনও সমাধানগুলি পাওয়া যায়, সুতরাং আমরা সত্যই কোনও অ্যালগরিদম রাখতে পারি না। Ω(NloglogN)O(N)
যুবাল ফিল্মাস

1
এখান থেকে, দেখে মনে হচ্ছে ক্যাচটি (এবং অতিরিক্ত নন-লিনিয়ার ফ্যাক্টর) লুপের সময় আপনার মূলের মধ্যে দুটি ফোরচ () লুপ থেকে আসে; আপনার মোট সময়টি হ'ল মূলত, এবং সমস্যাটি হ'ললিস্ট এবং লোলিস্টের আকারগুলি অবিচ্ছিন্নভাবে কোনও ধ্রুবক দ্বারা আবদ্ধ হয় না। i=0N/2|hiListNi||loListi|
স্টিভেন স্টাডনিকি

হ্যাঁ, এটি সঠিক, তবে আপনার সূত্রটি কিছুটা বন্ধ রয়েছে কারণ প্রথমে আমি 0 থেকে এপ্রিক্স পর্যন্ত। এন পিআই / 8, এবং দ্বিতীয় হ'ল iList (Ni) + লোলিস্ট (i) = এন এর মানগুলির একটি ভগ্নাংশ, সুতরাং সেগুলি সমস্তই যুক্ত হয় না any কোনও ইভেন্টে, এটি ঠিক করার কোনও উপায় নেই এবং আমি সুন্দর am নিশ্চিত হয়ে নিন যে এটি O (N লগ (লগ (এন))) এর ন্যূনতম সম্ভাব্য জটিলতা দেয়
আরবেরি ইয়ং ২১ শে

তবে আমাদের কাছে একটি অ্যালগরিদম থাকতে পারে যা হে (ম্যাক্স (এন, "সমাধানের সংখ্যা")) এ চলে যায়, ও (এন) স্থান গ্রহণ করে।
gnasher729

উত্তর:


15

জুহোর অ্যালগরিদমকে মধ্য-মধ্য-মাঝারি ব্যবহার করে কোনও অ্যালগরিদমতে উন্নত করা যায় । সমস্ত জোড়া all ; প্রতিটি জোড়া জন্য যেমন যে , দোকান কিছু অ্যারের মধ্যে দৈর্ঘ্যের (প্রতিটি অবস্থানে বিভিন্ন জোড়া, যা একটি যুক্ত তালিকা সঞ্চিত করা যেতে পারে থাকতে পারে)। এখন পেরে যান যাতে সংশ্লিষ্ট কক্ষগুলি খালি নয়।O(N) এম=2+বি2এন(,বি)টিএনএমএম,এন-এমটিA,BNM=A2+B2N(A,B)TNMM,NMT

এইভাবে আমরা সমস্ত চতুর্ভুজগুলির একটি অন্তর্নিহিত উপস্থাপনা পাই। যদি আমরা তাদের সকলের তালিকা বদ্ধ করতে চান তবে আমরা চেয়ে ভাল আর কিছু করতে পারি না , যেহেতু জ্যাকবীর চার বর্গাকার উপপাদ্যটি দেখায় যে (বিজোড় ) উপস্থাপনের সংখ্যা , এবং এমন অনেকগুলি পূর্ণসংখ্যা রয়েছে যেমন ( গ্রানওয়ালের উপপাদ্য দেখুন )।এন 8 σ ( এন ) σ ( এন ) ( γ - ε ) এন লগ ইন করুন লগ ইন এনΩ(NloglogN)N8σ(N)σ(N)(eγϵ)NloglogN

কম তুচ্ছ অ্যালগরিদম পেতে, কেউ উপযুক্ত চতুর্ভুজ রিংয়ের জন্য ফ্যাক্ট করার চেষ্টা করতে পারে , যেহেতু আমরা জানি যে ল্যাঞ্জ্রেজের চার-বর্গীয় পরিচয়ের মাধ্যমে দুটি বর্গের সমষ্টি হিসাবে উপস্থাপনাগুলি এই কারণগুলির সাথে সামঞ্জস্য করে (কিছুটা অর্থে)। আমাদের এখনও কোনও প্রাসঙ্গিক প্রধানের সমস্ত উপস্থাপনা খুঁজে বের করতে হবে।N


হুম, মিট-ইন-দ্য মিডল জিনিসটি আমি যা কাজ করছি তার প্রায় অনুরূপ বলে মনে হচ্ছে (প্রায় সম্পন্ন) যা টুস্কয়ার জোড়গুলির উপর একটি আরোহণ / অবতরণ মার্জ-ম্যাচ অ্যালগরিদম। ওটা কি একরকম শোনাচ্ছে?
আরবেরি ইয়ং

1
এটি সম্ভবত একই, সাক্ষাতকারটি মাঝামাঝি একটি সাধারণ হিউরিস্টিক যে এটির অনেকগুলি পৃথক নাম থাকতে হবে।
যুবাল ফিল্মাস

উম্ম, আমি তিরিশ বছর ধরে একাডেমিয়ার বাইরে আছি, অর্থ কী? (বা আপনি আমাকে একটি রেফারেন্সে নির্দেশ করতে পারেন?) thnx। σ(N)
আরবেরি ইয়ং

বা আসলেই ? ο ( এন )σ(N)ο(N)
আরবেরি ইয়ং

1
বিচ্ছেদকারীদের যোগফল কার্যত কার্য করে।
যুবাল ফিল্মাস

5

তুচ্ছ অ্যালগরিদমের জন্য আপনার কেবল এ, বি এবং সি এর জন্য লুপ দরকার এবং তারপরে ডি গণনা করুন এবং এটি একটি পূর্ণসংখ্যা কিনা তা পরীক্ষা করুন। আপনার যদি A ≤ B ≤ C ≤ D প্রয়োজন হয় তবে আপনার ও (N ^ 1.5) বরং একটি ছোট ধ্রুবক সহ পাওয়া উচিত।
gnasher729

প্রায় 0.04 এন ^ 1.5 ত্রিগুণ (এ, বি, সি), এবং পরীক্ষা করে যে এন - এ ^ 2 - বি ^ 2 - সি ^ 2 একটি বর্গক্ষেত্র খুব দ্রুত সম্পন্ন করা যায়।
gnasher729

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