একটি পূর্ণসংখ্যার জালিতে মিথ্যা ইতিবাচক


12

লিডারবোর্ড

 User            Language      Score
 =========================================
 Ell             C++11         293,619,555
 feersum         C++11         100,993,667
 Ell             C++11          78,824,732
 Geobits         Java           27,817,255
 Ell             Python         27,797,402
 Peter Taylor    Java                2,468
 <reference>     Julia                 530

পটভূমি

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

√(x² + y²)

সুতরাং একটি নিষ্পাপ বাস্তবায়ন উভয় ভেক্টরের জন্য এই মানটি গণনা করতে পারে এবং ফলাফলগুলির সাথে তুলনা করতে পারে। এটি কেবল একটি অপ্রয়োজনীয় বর্গমূলের গণনাই জোগায় না, এটি ভাসমান পয়েন্টের ভুলগুলি নিয়েও সমস্যা সৃষ্টি করে, যা মিথ্যা ধনাত্মকতা অর্জন করতে পারে: ভেক্টরগুলির দৈর্ঘ্য পৃথক, তবে যেখানে ভাসমান পয়েন্ট উপস্থাপনের উল্লেখযোগ্য সংখ্যাগুলি সমস্ত একই ical

এই চ্যালেঞ্জের উদ্দেশ্যে, আমরা একটি সমন্বয়যুক্ত জোড়ার জোড় হিসাবে একটি মিথ্যা ইতিবাচক সংজ্ঞা দিই (a,b)এবং (c,d)যার জন্য:

  • Squ৪-বিট স্বাক্ষরবিহীন পূর্ণ পূর্ণসংখ্যার হিসাবে উপস্থাপিত হলে তাদের স্কোয়ারের দৈর্ঘ্য আলাদা।
  • Magn৪-বিট বাইনারি ভাসমান পয়েন্ট সংখ্যা হিসাবে উপস্থাপিত হয়ে এবং 64৪-বিট বর্গাকার রুটের মাধ্যমে গণনা করা হয় ( আইইইই 75৫৪ অনুযায়ী ) তাদের মাত্রা অভিন্ন ।

উদাহরণস্বরূপ, ১--বিট উপস্থাপনা (64৪ এর পরিবর্তে) ব্যবহার করে, ক্ষুদ্রতম 1 টি ভেক্টর যা মিথ্যা ধনাত্মক ফল দেয়

(25,20) and (32,0)

তাদের ছক স্কোয়ারড মাত্রার হয় 1025এবং 1024। বর্গমূলের ফলন গ্রহণ করা

32.01562118716424 and 32.0

তবে ১--বিট ফ্লোটে এই দুটিই কেটে যায় 32.0

তেমনি, 32-বিট উপস্থাপনার জন্য একটি ভুয়া ধনাত্মক উপার্জনকারী ক্ষুদ্রতম 2 জুটি

(1659,1220) and (1951,659)

তাদের 16-বিট ভাসমান পয়েন্টের দৈর্ঘ্যের দ্বারা পরিমাপ করা 1 "সবচেয়ে ছোট"।
2 "ক্ষুদ্রতম" তাদের 32-বিট ভাসমান পয়েন্টের দৈর্ঘ্যের দ্বারা পরিমাপ করা হয়।

শেষ অবধি, এখানে কয়েকটি মুখ্য বৈধ 64৪-বিট মামলা রয়েছে:

 (51594363,51594339) and (54792160,48184783)
 (54356775,54353746) and (54620742,54088476)
 (54197313,46971217) and (51758889,49645356)
 (67102042,  956863) and (67108864,       6) *

* সর্বশেষতম কেসটি 64৪-বিট মিথ্যা ধনাত্মকতার জন্য ক্ষুদ্রতম সম্ভাব্য মাত্রা সহ কয়েকটিতে একটি।

চ্যালেঞ্জ

একক থ্রেড ব্যবহার করে ১০,০০০ বাইটেরও কম কোডে, আপনি স্থানাঙ্ক পরিসরে 64৪ -বিট (বাইনারি) ভাসমান পয়েন্ট সংখ্যাগুলির জন্য অনেকগুলি মিথ্যা ধনাত্মক সন্ধান করতে পারেন 0 ≤ y ≤ x(এটি কেবল ইউক্লিডিয়ান বিমানের প্রথম অক্টোবরের মধ্যে) যেমন যে মধ্যে 10 মিনিট । যদি একই সংখ্যার জোড়ের জন্য দুটি সাবমিশন টাই হয় তবে টাই ব্রেকারটি সেই জোড়াগুলির মধ্যে সর্বশেষটি খুঁজে পেতে প্রকৃত সময় হয়।x² + y² ≤ 253

আপনার প্রোগ্রামটি অবশ্যই কোনও সময়ে 4 গিগাবাইটের বেশি মেমরি ব্যবহার করা উচিত নয় (ব্যবহারিক কারণে)।

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

আমি আমার উইন্ডোজ 8 ল্যাপটপের সমস্ত জমা পরীক্ষা করব, সুতরাং আপনি যদি খুব অ-সাধারণ কিছু ভাষা ব্যবহার করতে চান তবে দয়া করে মন্তব্যে জিজ্ঞাসা করুন।

নোট করুন যে জোড়গুলি অবশ্যই প্রথম এবং দ্বিতীয় স্থানাঙ্ক যুগের পরিবর্তনে দুবার গণনা করা উচিত নয়

এটিও নোট করুন যে আমি আপনার প্রক্রিয়াটি রুবি কন্ট্রোলারের মাধ্যমে চালাব, যা 10 মিনিট পরে শেষ না হলে আপনার প্রক্রিয়াটি মেরে ফেলবে। ততক্ষণে পাওয়া জোড়গুলির সংখ্যা আউটপুট নিশ্চিত করে নিন। আপনি নিজেই সময় ট্র্যাক রাখতে পারেন এবং 10 মিনিট সময় পার হওয়ার আগেই ফলাফলটি মুদ্রণ করতে পারেন, বা আপনি কেবল বিক্ষিপ্তভাবে পাওয়া জোড়া সংখ্যা আউটপুট করতে পারেন এবং আমি আপনার স্কোরের মতো শেষ সংখ্যাটি গ্রহণ করব।


পার্শ্বের মন্তব্য হিসাবে, কোনও পূর্ণসংখ্যা একটি নিখুঁত বর্গক্ষেত্র কিনা তা একসাথে নির্ধারণ করা সম্ভব এবং দক্ষতার সাথে এর সুনির্দিষ্ট বর্গাকার মূল গণনা করাও সম্ভব। নিম্নোক্ত অ্যালগরিদমটি আমার সিস্টেমে হার্ডওয়্যার স্কোয়ার রুটের চেয়ে 5x দ্রুত (64-বিট স্বাক্ষরিত ইন্টিজারগুলি 80-বিট দীর্ঘ ডাবলের
টোড লেহম্যান

উত্তর:


5

সি ++, 275,000,000+

আমরা যেমন জোড়া যার মাত্রার সঠিকভাবে representable হয়, পড়ুন করব (এক্স, 0) হিসাবে, সৎ জোড়া এবং অন্যান্য সমস্ত জোড়া জন্য অসৎ জোড়া মাত্রার মি , যেখানে মি যুগল এর ভুলভাবে রিপোর্ট মাত্রার হয়। পূর্ববর্তী পোস্টের প্রথম প্রোগ্রামটিতে যথেষ্ট পরিমাণে এক্সের জন্য যথাক্রমে সৎ- এবং অসাধু-জোড়া:
(x, 0) এবং (x, 1) এর দৃ tight়ভাবে সম্পর্কিত দম্পতির একটি সেট ব্যবহৃত হয়েছিল। দ্বিতীয় প্রোগ্রামটি একই অসাধু জোড়ার সেটটি ব্যবহার করেছিল তবে অবিচ্ছেদ্য আকারের সমস্ত সৎ জোড়াকে সন্ধান করে সৎ জোড়ার সেটটি প্রসারিত করে। প্রোগ্রামটি দশ মিনিটের মধ্যে শেষ হয় না, তবে এটির ফলাফলগুলির সিংহভাগ সন্ধান পেয়েছে খুব শীঘ্রই, যার অর্থ বেশিরভাগ রানটাইম নষ্ট হয়ে যায়। সদা-কম ঘন ঘন সৎ জোড়গুলির সন্ধানের পরিবর্তে, এই প্রোগ্রামটি পরবর্তী যুক্তিযুক্ত জিনিসটি করার জন্য অতিরিক্ত সময় ব্যবহার করে: অসাধু জোড়ার সেট বাড়িয়ে দেয় ।

পূর্ববর্তী পোস্ট থেকে আমরা জানি যে সমস্ত বৃহত পর্যাপ্ত পূর্ণসংখ্যার জন্য r , sqrt (r 2 + 1) = r , যেখানে স্কয়ার্টটি হল ভাসমান-পয়েন্ট বর্গক্ষেত্রের ফাংশন। আমাদের আক্রমণের পরিকল্পনাটি কয়েকটি বড়-পর্যাপ্ত পূর্ণসংখ্যার r এর জন্য জোড়া = (x, y) যেমন x 2 + y 2 = r 2 + 1 এর সন্ধান করা । এটি করার পক্ষে যথেষ্ট সহজ, তবে নির্মমভাবে স্বতন্ত্রভাবে এই জাতীয় জোড়া অনুসন্ধান করা আকর্ষণীয় হতে খুব ধীর is আমরা আগের প্রোগ্রামগুলিতে যেমন সৎ জোড়ার জন্য করেছি ঠিক তেমনই আমরা এই জোড়াগুলিকেও বাল্কে সন্ধান করতে চাই।

যাক { বনাম , W } ভেক্টর একটি orthonormal যুগল হও। সমস্ত বাস্তব স্কেলারের জন্য r , || r v + w || 2 = আর 2 + 1 । ইন 2 , এই পিথাগোরাসের উপপাদ্য প্রত্যক্ষ ফল হল:

ছবি 1

আমরা ভেক্টর v এবং w এর সন্ধান করছি যে সেখানে একটি পূর্ণসংখ্যা r রয়েছে যার জন্য x এবং y এছাড়াও পূর্ণসংখ্যা। একটি সাইড নোট, নোট যে আমরা আগের দুই প্রোগ্রাম ব্যবহার করা অসৎ যুগলের সেট কেবল এই, যেখানে একটি বিশেষ ক্ষেত্রে ছিল হিসাবে { বনাম , W } মান ভিত্তি ছিল 2 ; এবার আমরা আরও সাধারণ সমাধান খুঁজতে চাই। এই যেখানে পিথাগোরাস Triplets (পূর্ণসংখ্যার Triplets (A, B, C) পরিতৃপ্ত একটি 2 + খ 2 = C 2যা আমরা পূর্ববর্তী প্রোগ্রামে ব্যবহার করেছি) তাদের প্রত্যাবর্তন করে।

যাক (A, B, C) একটি পিথাগোরাস ত্রয়ী হও। ভেক্টর v = (বি / সি, এ / সি) এবং ডাব্লু = (-এ / সি, বি / সি) (এবং
ডাব্লু = (একটি / সি,-বি / সি) ) অর্থোন্নর, যাচাই করা সহজ । এটি সক্রিয় আউট হিসাবে, পিথাগোরাস ত্রয়ী কোন পছন্দ জন্য, অস্তিত্ব আছে একটি পূর্ণসংখ্যা R যেমন যে এক্স এবং ওয়াই পূর্ণসংখ্যা। এটি প্রমাণ করার জন্য, এবং কার্যকরভাবে r এবং P সন্ধান করার জন্য আমাদের অল্প সংখ্যক / গ্রুপ তত্ত্বের প্রয়োজন; আমি বিশদটি ছাড়াই যাচ্ছি। যে কোনও উপায়ে, ধরুন আমাদের কাছে আমাদের অবিচ্ছেদ্য r , x এবং y রয়েছে । আমরা এখনও কয়েকটি জিনিস থেকে কম: আমাদের আর দরকারযথেষ্ট বড় হওয়ার জন্য এবং আমরা এটির থেকে আরও অনেক অনুরূপ জোড়া আনার জন্য একটি দ্রুত পদ্ধতি চাই। ভাগ্যক্রমে, এটি সম্পাদন করার একটি সহজ উপায় রয়েছে।

লক্ষ্য করুন প্রজেকশন পি সম্মুখের বনাম হয় V , অত r = পি · বনাম = (X, Y) · (খ / সি, A / C) = xb / C + + আগে / C যে, সমস্ত এই বলে xb + + ইয়া = আরসি । ফলস্বরূপ, সমস্ত পূর্ণসংখ্যার জন্য এন , (x + বিএন) 2 + (y + an) 2 = (x 2 + y 2 ) + 2 (এক্সবি + ইয়া) এন + (একটি 2 + বি 2 ) এন 2 = ( আর 2 + 1) + 2 (আরসি) এন + (সি 2 ) এন 2 = (আর + সিএন) 2 + 1। অন্য কথায়, ফর্মের যুগলের স্কোয়ারড মাত্রার
(এক্স + + বাংলা ভাষায়, Y + একটি) হয় (R + + CN) 2 + 1 টি , যা ঠিক জোড়া আমরা খুঁজছেন ধরনের হয়! বড় পরিমাণে এন এর জন্য এগুলি দৈর্ঘ্যের আর + সিএন এর অসাধু জোড়

এটি একটি দৃ concrete় উদাহরণ দেখতে সর্বদা সুন্দর। যদি আমরা পাইথাগোরিয়ান ট্রিপলেট (3, 4, 5) নিই , তবে r = 2 এ আমাদের পি = (1, 2) রয়েছে (আপনি এটি পরীক্ষা করতে পারেন (1, 2) · (4/5, 3/5) = 2 এবং, স্পষ্ট, 1 2 +2 2 = 2 2 + 1 টি ।) যোগ করার পদ্ধতি 5 থেকে এবং (4, 3) থেকে পি আমাদেরকে লাগে R '= 2 +5 = 7 এবং পি' = (1 + + 4, 2+ 3) = (5, 5) । দেখুন এবং দেখুন, 5 2 + 5 2 = 7 2 + 1। পরবর্তী স্থানাঙ্কগুলি হ'ল r '' = 12 এবং পি '' = (9, 8) , এবং আবার, 9 2 + 8 2 = 12 2 + 1 এবং আরও কিছু ...

ছবি 2

আর একবার যথেষ্ট পরিমাণে বড় হয়ে গেলে আমরা 5 এর দৈর্ঘ্যের বৃদ্ধি সহ অসাধু জুটি পেতে শুরু করি । এটি প্রায় 27,797,402 / 5 অসাধু জুটি।

সুতরাং এখন আমাদের কাছে প্রচুর অবিচ্ছেদ্য-দৈর্ঘ্যের অসাধু জুটি। আমরা সহজেই তাদেরকে প্রথম প্রোগ্রামের সৎ জুটি দিয়ে ভুল-পজিটিভ তৈরি করতে পারি এবং যথাযথ যত্নের সাথে আমরা দ্বিতীয় প্রোগ্রামের সৎ জোড়াও ব্যবহার করতে পারি। এটি মূলত এই প্রোগ্রামটি করে। পূর্ববর্তী প্রোগ্রামের মতো এটিও এর বেশিরভাগ ফলাফল খুব তাড়াতাড়ি খুঁজে পায় --- এটি কয়েক সেকেন্ডের মধ্যে 200,000,000 মিথ্যা ধনাত্মক হয়ে যায় --- এবং তারপরে যথেষ্ট গতিতে ধীর হয়ে যায়।

সংকলন g++ flspos.cpp -oflspos -std=c++11 -msse2 -mfpmath=sse -O3। ফলাফল যাচাই করতে, যুক্ত করুন -DVERIFY(এটি উল্লেখযোগ্যভাবে ধীর হবে))

সাথে চালাও flspos। ভার্বোজ মোডের জন্য কোনও কমান্ড-লাইন যুক্তি।

#include <cstdio>
#define _USE_MATH_DEFINES
#undef __STRICT_ANSI__
#include <cmath>
#include <cfloat>
#include <vector>
#include <iterator>
#include <algorithm>

using namespace std;

/* Make sure we actually work with 64-bit precision */
#if defined(VERIFY) && FLT_EVAL_METHOD != 0 && FLT_EVAL_METHOD != 1
#   error "invalid FLT_EVAL_METHOD (did you forget `-msse2 -mfpmath=sse'?)"
#endif

template <typename T> struct widen;
template <> struct widen<int> { typedef long long type; };

template <typename T>
inline typename widen<T>::type mul(T x, T y) {
    return typename widen<T>::type(x) * typename widen<T>::type(y);
}
template <typename T> inline T div_ceil(T a, T b) { return (a + b - 1) / b; }
template <typename T> inline typename widen<T>::type sq(T x) { return mul(x, x); }
template <typename T>
T gcd(T a, T b) { while (b) { T t = a; a = b; b = t % b; } return a; }
template <typename T>
inline typename widen<T>::type lcm(T a, T b) { return mul(a, b) / gcd(a, b); }
template <typename T>
T div_mod_n(T a, T b, T n) {
    if (b == 0) return a == 0 ? 0 : -1;
    const T n_over_b = n / b, n_mod_b = n % b;
    for (T m = 0; m < n; m += n_over_b + 1) {
        if (a % b == 0) return m + a / b;
        a -= b - n_mod_b;
        if (a < 0) a += n;
    }
    return -1;
}

template <typename T> struct pythagorean_triplet { T a, b, c; };
template <typename T>
struct pythagorean_triplet_generator {
    typedef pythagorean_triplet<T> result_type;
private:
    typedef typename widen<T>::type WT;
    result_type p_triplet;
    WT p_c2b2;
public:
    pythagorean_triplet_generator(const result_type& triplet = {3, 4, 5}) :
        p_triplet(triplet), p_c2b2(sq(triplet.c) - sq(triplet.b))
    {}
    const result_type& operator*() const { return p_triplet; }
    const result_type* operator->() const { return &p_triplet; }
    pythagorean_triplet_generator& operator++() {
        do {
            if (++p_triplet.b == p_triplet.c) {
                ++p_triplet.c;
                p_triplet.b = ceil(p_triplet.c * M_SQRT1_2);
                p_c2b2 = sq(p_triplet.c) - sq(p_triplet.b);
            } else
                p_c2b2 -= 2 * p_triplet.b - 1;
            p_triplet.a = sqrt(p_c2b2);
        } while (sq(p_triplet.a) != p_c2b2 || gcd(p_triplet.b, p_triplet.a) != 1);
        return *this;
    }
    result_type operator()() { result_type t = **this; ++*this; return t; }
};

int main(int argc, const char* argv[]) {
    const bool verbose = argc > 1;

    const int min = 1 << 26;
    const int max = sqrt(1ll << 53);

    const size_t small_triplet_count = 1000;
    vector<pythagorean_triplet<int>> small_triplets;
    small_triplets.reserve(small_triplet_count);
    generate_n(
        back_inserter(small_triplets),
        small_triplet_count,
        pythagorean_triplet_generator<int>()
    );

    int found = 0;
    auto add = [&] (int x1, int y1, int x2, int y2) {
#ifdef VERIFY
        auto n1 = sq(x1) + sq(y1), n2 = sq(x2) + sq(y2);
        if (x1 < y1 || x2 < y2 || x1 > max || x2 > max ||
            n1 == n2 || sqrt(n1) != sqrt(n2)
        ) {
            fprintf(stderr, "Wrong false-positive: (%d, %d) (%d, %d)\n",
                    x1, y1, x2, y2);
            return;
        }
#endif
        if (verbose) printf("(%d, %d) (%d, %d)\n", x1, y1, x2, y2);
        ++found;
    };

    int output_counter = 0;
    for (int x = min; x <= max; ++x) add(x, 0,    x, 1);
    for (pythagorean_triplet_generator<int> i; i->c <= max; ++i) {
        const auto& t1 = *i;

        for (int n = div_ceil(min, t1.c); n <= max / t1.c; ++n)
            add(n * t1.b, n * t1.a,    n * t1.c, 1);

        auto find_false_positives = [&] (int r, int x, int y) {
            {
                int n = div_ceil(min - r, t1.c);
                int min_r = r + n * t1.c;
                int max_n = n + (max - min_r) / t1.c;
                for (; n <= max_n; ++n)
                    add(r + n * t1.c, 0,    x + n * t1.b, y + n * t1.a);
            }
            for (const auto t2 : small_triplets) {
                int m = div_mod_n((t2.c - r % t2.c) % t2.c, t1.c % t2.c, t2.c);
                if (m < 0) continue;
                int sr = r + m * t1.c;
                int c = lcm(t1.c, t2.c);
                int min_n = div_ceil(min - sr, c);
                int min_r = sr + min_n * c;
                if (min_r > max) continue;
                int x1 = x + m * t1.b, y1 = y + m * t1.a;
                int x2 = t2.b * (sr / t2.c), y2 = t2.a * (sr / t2.c);
                int a1 = t1.a * (c / t1.c), b1 = t1.b * (c / t1.c);
                int a2 = t2.a * (c / t2.c), b2 = t2.b * (c / t2.c);
                int max_n = min_n + (max - min_r) / c;
                int max_r = sr + max_n * c;
                for (int n = min_n; n <= max_n; ++n) {
                    add(
                        x2 + n * b2, y2 + n * a2,
                        x1 + n * b1, y1 + n * a1
                    );
                }
            }
        };
        {
            int m = div_mod_n((t1.a - t1.c % t1.a) % t1.a, t1.b % t1.a, t1.a);
            find_false_positives(
                /* r = */ (mul(m, t1.c) + t1.b) / t1.a,
                /* x = */ (mul(m, t1.b) + t1.c) / t1.a,
                /* y = */ m
            );
        } {
            int m = div_mod_n((t1.b - t1.c % t1.b) % t1.b, t1.a, t1.b);
            find_false_positives(
                /* r = */ (mul(m, t1.c) + t1.a) / t1.b,
                /* x = */ m,
                /* y = */ (mul(m, t1.a) + t1.c) / t1.b
            );
        }

        if (output_counter++ % 50 == 0)
            printf("%d\n", found), fflush(stdout);
    }
    printf("%d\n", found);
}

নিস! :) আমি আমার মেশিনে 293,619,555 পেয়েছি এবং লিডারবোর্ড আপডেট করেছি।
মার্টিন এন্ডার

8

পাইথন, 27,797,402

শুধু বারটি আরও উঁচুতে সেট করতে ...

from sys import argv
verbose = len(argv) > 1
found = 0
for x in xrange(67108864, 94906266):
    found += 1
    if verbose:
        print "(%d, 0) (%d, 1)" % (x, x)
print found

এটি যাচাই করা সহজ যে সমস্ত 67,108,864 <= x <= 94,906,265 = মেঝে (বর্গক্ষেত্র (2 53% ) জোড়া (x, 0) এবং (x, 1) মিথ্যা ধনাত্মক।

এটি কেন কাজ করে : 67,108,864 = 2 26 । এরপরে, উপরের রেঞ্জের সমস্ত সংখ্যা x কিছু 0 <= x '<2 26 এর জন্য 2 26 + x' ফর্মের । সমস্ত ধনাত্মক , (x + ই) 2 = x 2 + 2xe + ই 2 = এক্স 2 + 2 27 ই + 2x'e + ই 2 এর জন্য । আমরা আছে করতে চান তাহলে (এক্স + E) 2 = এক্স 2 + 1 টি আমরা প্রয়োজন অন্তত 2 27 ই <= 1 , যে ই <= 2 -27
যাইহোক, ডবল স্পষ্টতা ফ্লোটিং পয়েন্ট সংখ্যার অংশক 52-বিট চওড়া সাল থেকে ক্ষুদ্রতম যেমন যে এক্স + E> X হয় ই = 2 26 - 52 = 2 -26 । অন্য কথায়, চেয়ে ক্ষুদ্রতম representable সংখ্যা বৃহত্তর এক্স হয় X + + 2 -26 যখন ফল SQRT (এক্স 2 + 1 টি) সবচেয়ে হয় X + + 2 -27 । যেহেতু ডিফল্ট আইইইই-75 75৪ রাউন্ডিং মোডটি গোল-থেকে-নিকটতম; সমান-সমান , এটি সর্বদা x এর সাথে গোল হবে এবং কখনই x + 2 -26 এ যাবে না (যেখানে টাই- ব্রেকটি কেবলমাত্র x = 67,108,864 এর জন্য প্রাসঙ্গিক, যদি এ সব. যে কোনও বৃহত্তর সংখ্যা নির্বিশেষে x এর সাথে মিলিত হবে)।


সি ++, 75,000,000+

3 3 + 4 2 = 5 2 স্মরণ করুন । এর অর্থ কী, বিন্দুটি (4, 3) উত্সের চারপাশে কেন্দ্রে 5 ব্যাসার্ধের বৃত্তের মধ্যে অবস্থিত । প্রকৃতপক্ষে, সমস্ত পূর্ণসংখ্যার জন্য এন , (4 এন, 3 এন) এর ব্যাসার্ধ 5n এর মধ্যে থাকে । যথেষ্ট পরিমাণে এন (যথা, 5n> = 2 26 ) এর জন্য, আমরা ইতিমধ্যে এই বৃত্তের সমস্ত পয়েন্টের জন্য একটি মিথ্যা-পজিটিভ জানি: (5 এন, 1) । গ্রেট! এটি অন্য 27,797,402 / 5 বিনামূল্যে মিথ্যা-পজিটিভ জুটি আছে! তবে এখানে কেন থামবেন? (3, 4, 5) কেবল এই জাতীয় ট্রিপলেট নয়।

এই প্রোগ্রামটি সমস্ত ধনাত্মক পূর্ণ ট্রিপল (ক, খ, সি) অনুসন্ধান করে যেমন একটি 2 + বি 2 = সি 2 , এবং এই ফ্যাশনে ভুয়া-পজিটিভ গণনা করে। এটি 70,000,000 -তে ভুয়া-পজিটিভ হয়ে যায় খুব দ্রুত তবে সংখ্যাটি বাড়ার সাথে সাথে এটি বেশ কমে যায়।

সংকলন g++ flspos.cpp -oflspos -std=c++11 -msse2 -mfpmath=sse -O3। ফলাফল যাচাই করতে, যুক্ত করুন -DVERIFY(এটি উল্লেখযোগ্যভাবে ধীর হবে))

সাথে চালাও flspos। ভার্বোজ মোডের জন্য কোনও কমান্ড-লাইন যুক্তি।

#include <cstdio>
#include <cmath>
#include <cfloat>

using namespace std;

/* Make sure we actually work with 64-bit precision */
#if defined(VERIFY) && FLT_EVAL_METHOD != 0 && FLT_EVAL_METHOD != 1
#   error "invalid FLT_EVAL_METHOD (did you forget `-msse2 -mfpmath=sse'?)"
#endif

template <typename T> inline long long sqr(T x) { return 1ll * x * x; }
template <typename T>
T gcd(T a, T b) { while (b) { T t = a; a = b; b = t % b; } return a; }

int main(int argc, const char* argv[]) {
    const bool verbose = argc > 1;

    const int min = 1 << 26;
    const int max = sqrt(1ll << 53);

    int found = 0;
    auto add = [=, &found] (int x1, int y1, int x2, int y2) {
#ifdef VERIFY
        auto n1 = sqr(x1) + sqr(y1), n2 = sqr(x2) + sqr(y2);
        if (n1 == n2 || sqrt(n1) != sqrt(n2)) {
            fprintf(stderr, "Wrong false-positive: (%d, %d) (%d, %d)\n",
                    x1, y1, x2, y2);
            return;
        }
#endif
        if (verbose) printf("(%d, %d) (%d, %d)\n", x1, x2, y1, y2);
        ++found;
    };

    for (int x = min; x <= max; ++x) add(x, 0,    x, 1);

    for (int a = 1; a < max; ++a) {
        auto a2b2 = sqr(a) + 1;
        for (int b = 1; b <= a; a2b2 += 2 * b + 1, ++b) {
            int c = sqrt(a2b2);
            if (a2b2 == sqr(c) && gcd(a, b) == 1) {
                int max_c = max / c;
                for (int n = (min + c - 1) / c; n <= max_c; ++n)
                    add(n * a, n * b,    n * c, 1);
            }
        }

        if (a % 512 == 0) printf("%d\n", found), fflush(stdout);
    }

    printf("%d\n", found);
}

হ্যাঁ, এটি কার্যকর কৌশল। আমি ভেবেছিলাম যে 2**53সীমানাটি এটিকে শাসনের জন্য বেছে নেওয়া হয়েছিল, তবে আমার ধারণা নেই।
xnor

এই পরিসরের প্রতিটি সংখ্যা x ^ 2 এবং x ^ 2 + 1 এর বর্গমূলের একটি পূর্ণসংখ্যার + 1/2 এর বিভিন্ন দিকে পড়ার একক উদাহরণ ছাড়াই কীভাবে কাজ করে তা মজাদার।
শুক্রবার

@xnor বর্গক্ষেত্রের মাত্রাটি 64৪-বিট ফ্লোটে হুবহু উপস্থাপনযোগ্য হওয়ার জন্য এই সীমানাটি বেছে নেওয়া হয়েছিল।
মার্টিন ইন্ডার

আরে, এটা কাজ করে, কে কিভাবে যত্ন করে? ;) আপনি কি বোঝাতে চেয়েছেন যে প্রোগ্রামটি একটি ডামি লুপে গণনা করা উচিত, বা আসলে ফলাফলগুলি যাচাই করা উচিত?
Ell

@ মার্টিনবাটনার ওহ, আমি দেখছি দেখে মনে হচ্ছে যে নিম্ন স্তরের পরিমাণটি 2 এর বর্গমূল দিয়ে বিভক্ত হয়েছে I
xnor

4

সি ++ 11 - 100,993,667

সম্পাদনা: নতুন প্রোগ্রাম

পুরানোটি খুব বেশি স্মৃতি ব্যবহার করেছে। এটি হ্যাশ টেবিলের পরিবর্তে দৈত্য ভেক্টর অ্যারে ব্যবহার করে মেমরির ব্যবহার অর্ধেক করে দেয়। এছাড়াও এটি এলোমেলো থ্রেড ক্রাফ্টটি সরিয়ে দেয়।

   /* by feersum  2014/9
   http://codegolf.stackexchange.com/questions/37627/false-positives-on-an-integer-lattice */
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <functional>
#include <vector>
using namespace std;
#define ul unsigned long long

#define K const



#define INS(A)   { bool already = false; \
    for(auto e = res[A.p[0][0]].end(), it = res[A.p[0][0]].begin(); it != e; ++it) \
        if(A.p[0][1] == it->y1 && A.p[1][0] == it->x2 && A.p[1][1] == it->y2) { \
            already = true; \
            break; } \
    if(!already) res[A.p[0][0]].push_back( {A.p[0][1], A.p[1][0], A.p[1][1]} ), ++n; }

#define XMAXMIN (1<<26)

struct ints3 {
    int y1, x2, y2;
};


struct pparm {
    int a,b,c,d;
    int E[4];
    pparm(int A,int B,int C, int D):
        E{B*B+D*D,A*B+C*D,A*A+C*C+2*(B+D),A+C}
    {
        a=A;b=B;c=C;d=D;
    }

};

struct ans {
    int p[2][2];

};
ostream&operator<<(ostream&o, ans&a)
{
    o<<'('<<a.p[0][0]<<','<<a.p[0][1]<<"),("<<a.p[1][0]<<','<<a.p[1][1]<<')'<<endl;
    return o;
}



vector<ints3> res[XMAXMIN];

bool print;
int n;

void gen(K pparm&p1, K pparm&p2)
{
#ifdef DBUG
    for(int i=0;i<2;i++){
    K pparm&p=i?p2:p1;
    cout<<' '<<p.a<<' '<<p.b<<' '<<p.c<<' '<<p.d<<' ';}
    cout<<endl;
#endif

    for(ul x = 0; ; ++x) {
        ans a;
        ul s[2];
        for(int i = 0; i < 2; i++) {
            K pparm &p = i?p2:p1;
            int *pt = a.p[i];
            pt[0] = p.b+x*(p.a+x);
            pt[1] = p.d+x*(p.c+x);
            s[i] = (ul)pt[0]*pt[0] + (ul)pt[1]*pt[1];
        }
        if(*s >> 53)
            break;
if(s[1] - s[0] != 1)
exit(4);

        if(sqrt(s[0]) == sqrt(s[1])) {
             for(int i = 0; i < 2; i++)
                if(a.p[i][0] > a.p[i][1])
                    swap(a.p[i][0], a.p[i][1]);
            if(a.p[0][0] > a.p[0][1])
                for(int i = 0; i < 2; i++)
                    swap(a.p[0][i], a.p[1][i]);
            INS(a)
        }
    }
}



int main(int ac, char**av)
{
    for(int i = 1; i < ac; i++) {
        print |= !strcmp(av[1], "-P");
    }


    #define JMAX 43000000
    for(ul j = 0; j < JMAX; j++) {
        pparm p1(-~j,j,~-j,0),p2(j,1,j,j);
        gen(p1,p2);
        if(!print && !(j%1024))
#ifdef DBUG
            cout<<j<<' ',
#endif
            cout<<n<<endl;

    }
    if(print) 
        for(vector<ints3>& v: res)
            for(ints3& i: v)
                printf("(%d,%d),(%d,%d)\n", &v - res, i.y1, i.x2, i.y2);

    return 0;
}

-Pপয়েন্টের সংখ্যার পরিবর্তে পয়েন্ট আউট করার জন্য একটি যুক্তি দিয়ে চালান ।

আমার জন্য এটি গণনা মোডে 2 মিনিটের কম সময় নেয় এবং কোনও ফাইলের প্রিন্টিংয়ের সাথে প্রায় 5 মিনিট সময় লাগে (4 গিগাবাইট), সুতরাং এটি যথেষ্ট পরিমাণে I / O সীমাবদ্ধ হয়ে উঠেনি।

আমার আসল প্রোগ্রামটি ছিল ঝরঝরে, তবে আমি এর বেশিরভাগটি বাদ দিয়েছি কারণ এটি কেবলমাত্র 10 ^ 5 ফলাফলের ক্রমতে উত্পাদন করতে পারে। এটি যা করেছিল তা হল ফর্মের প্যারামিটারাইজেশনগুলি অনুসন্ধান করা (x ^ 2 + এক্স + বি, এক্স ^ 2 + সিএক্স + ডি), (x ^ 2 + কুড়াল + বি, এক্স ^ 2 + সিক্স + ডি) যেমন যে কোনওর জন্য x, (x ^ 2 + অক্ষ + বি) ^ 2 + (x ^ 2 + সিক্স + ডি) ^ 2 = (x ^ 2 + অক্ষ + বি) ^ 2 + (x ^ 2 + সিক্স + ডি) ^ 2 + ১. এটি যখন প্যারামিটারের এমন একটি সেট খুঁজে পেয়েছিল {a, b, c, d, A, B, C, D} এটি সর্বোচ্চের অধীনে সমস্ত এক্স মানগুলি পরীক্ষা করে এগিয়ে যায়। এই প্রোগ্রামটি থেকে আমার ডিবাগ আউটপুটটি দেখার সময়, আমি প্যারামিটারাইজেশনটির প্যারামিটারাইজেশনটির একটি নির্দিষ্ট প্যারামিটারাইজেশন লক্ষ্য করেছি যা আমাকে সহজেই প্রচুর সংখ্যা উত্পাদন করতে দেয় allowed আমি নিজের সংখ্যা প্রচুর ছিল বলে আমি এল এর নম্বরগুলি প্রিন্ট না করার সিদ্ধান্ত নিয়েছি। আশা করি এখন কেউ আমাদের দুটি সংখ্যার সেট মুদ্রণ করবে না এবং বিজয়ী হিসাবে দাবি করবে :)

 /* by feersum  2014/9
   http://codegolf.stackexchange.com/questions/37627/false-positives-on-an-integer-lattice */
    #include <iostream>
    #include <cmath>
    #include <cstdlib>
    #include <cstring>
    #include <functional>
    #include <unordered_set>
    #include <thread>
using namespace std;
#define ul unsigned long long

#define h(S) unordered_##S##set
#define P 2977953206964783763LL
#define K const

#define EQ(T, F)bool operator==(K T&o)K{return!memcmp(F,o.F,sizeof(F));}

struct pparm {
    int a,b,c,d;
    int E[4];
    pparm(int A,int B,int C, int D):
        E{B*B+D*D,A*B+C*D,A*A+C*C+2*(B+D),A+C}
    {
        a=A;b=B;c=C;d=D;
    }
    EQ(pparm,E)
};

struct ans {
    int p[2][2];
    EQ(ans,p)
};
ostream&operator<<(ostream&o, ans&a)
{
    o<<'('<<a.p[0][0]<<','<<a.p[0][1]<<"),("<<a.p[1][0]<<','<<a.p[1][1]<<')'<<endl;
    return o;
}

#define HASH(N,T,F) \
struct N { \
    size_t operator() (K T&p) K { \
        size_t h = 0; \
        for(int i = 4; i--; ) \
            h=h*P+((int*)p.F)[i]; \
        return h; \
    }};

#define INS(r, a) { \
    bool new1 = r.insert(a).second; \
    n += new1; \
    if(print && new1) \
        cout<<a; }

HASH(HA,ans,p)

bool print;
int n;

void gen(h()<ans,HA>&r, K pparm&p1, K pparm&p2)
{
#ifdef DBUG
    for(int i=0;i<2;i++){
    K pparm&p=i?p2:p1;
    cout<<' '<<p.a<<' '<<p.b<<' '<<p.c<<' '<<p.d<<' ';}
    cout<<endl;
#endif

    for(ul x = 0; ; ++x) {
        ans a;
        ul s[2];
        for(int i = 0; i < 2; i++) {
            K pparm &p = i?p2:p1;
            int *pt = a.p[i];
            pt[0] = p.b+x*(p.a+x);
            pt[1] = p.d+x*(p.c+x);
            s[i] = (ul)pt[0]*pt[0] + (ul)pt[1]*pt[1];
        }
        if(*s >> 53)
            break;
if(s[1] - s[0] != 1)
exit(4);

        if(sqrt(s[0]) == sqrt(s[1])) {
             for(int i = 0; i < 2; i++)
                if(a.p[i][0] > a.p[i][1])
                    swap(a.p[i][0], a.p[i][1]);
            INS(r,a)
        }
    }
    //if(!print) cout<<n<<endl;
}

void endit()
{
    this_thread::sleep_for(chrono::seconds(599));
    exit(0);
}

int main(int ac, char**av)
{
    bool kill = false;
    for(int i = 1; i < ac; i++) {
        print |= ac>1 && !stricmp(av[1], "-P");
        kill |= !stricmp(av[i], "-K");
    }

    thread KILLER;
    if(kill)
        KILLER = thread(endit);

    h()<ans, HA> res;
    res.reserve(1<<27);

    #define JMAX 43000000
    for(ul j = 0; j < JMAX; j++) {
        pparm p1(-~j,j,~-j,0),p2(j,1,j,j);
        gen(res,p1,p2);
        if(!print && !(j%1024))
#ifdef DBUG
            cout<<j<<' ',
#endif
            cout<<n<<endl;

    }
    exit(0);
}

আমি সংকলক ত্রুটিগুলির একটি গুচ্ছ পাচ্ছি: পেস্টবিন.com / en এনসিওয়াই9fx কোনও ক্লু কি হচ্ছে?
মার্টিন এন্ডার

@ মার্টিন কোনও ধারণা নেই ... আমি আমার পোস্টটি একটি ফাইলে অনুলিপি করেছি, উইন্ডোজ 8 ল্যাপটপে অভিন্ন সুইচগুলি সহ সংকলিত। আমার জন্য ভাল কাজ করে। আপনার কাছে জিসিসির কোন সংস্করণ রয়েছে?
feersum

বিটিডব্লিউ যদি ত্রুটি সৃষ্টি করে তবে আপনি কেবলমাত্র থ্রেড-সম্পর্কিত বিটগুলি মুছতে পারেন যা সম্পূর্ণ অপ্রয়োজনীয়। আপনি কেবল "-K" বিকল্পটি ব্যবহার করেন যদি এটির প্রয়োজন হয় না তবে তারা কিছু করে।
feersum

g++ (GCC) 4.8.1। ঠিক আছে, আমি থ্রেড বিটগুলি সরিয়েছি, তবে এটি এখনও stricmpকোনও কারণে স্বীকৃত নয় ।
মার্টিন এন্ডার

1
আমি এই মুহুর্তে আরও অনেকগুলি জিনিস পেয়েছি, সুতরাং আমি আপনাকে আপনার পদ্ধতির উন্নতির জন্য আমার ধারণাটি বলব। ব্যাসার্ধের শীর্ষ প্রান্তের কাছাকাছি ব্যাসার্ধ-বর্গক্ষেত্রের সাথে, আপনি ব্যাসার্ধ-বর্গক্ষেত্রের মধ্যে সংঘর্ষও পেতে পারেন যা 2 দ্বারা পৃথক হয়
পিটার টেলর

1

জাভা, ব্রেনহাম-এস্কো সার্কেল স্ক্যান

তাত্পর্যপূর্ণভাবে আমি বার্ষিকীটির বিস্তৃত প্রান্তটি শুরু করে আরও সংঘর্ষের প্রত্যাশা করি। আমি প্রতিটি সংঘর্ষের জন্য একটি করে স্ক্যান করে কিছু উন্নতি পাওয়ার প্রত্যাশা করেছি, যার surplusমধ্যে মান 0এবং r2max - r2অন্তর্ভুক্তের জন্য রেকর্ডিং মান রয়েছে তবে আমার পরীক্ষায় যা এই সংস্করণটির চেয়ে ধীর হয়ে গেছে। একইভাবে int[]প্রচুর দ্বি-উপাদান অ্যারে এবং তালিকাগুলি তৈরির পরিবর্তে একটি একক বাফার ব্যবহার করার চেষ্টা করে । পারফরম্যান্স অপটিমাইজেশন সত্যই একটি অদ্ভুত জন্তু।

জোড়গুলির আউটপুট, এবং সাধারণ গণনা ছাড়াই কমান্ড-লাইন আর্গুমেন্ট দিয়ে চালান।

import java.util.*;

public class CodeGolf37627 {
    public static void main(String[] args) {
        final int M = 144;
        boolean[] possible = new boolean[M];
        for (int i = 0; i <= M/2; i++) {
            for (int j = 0; j <= M/2; j++) {
                possible[(i*i+j*j)%M] = true;
            }
        }

        long count = 0;
        double sqrt = 0;
        long r2max = 0;
        List<int[]> previousPoints = null;
        for (long r2 = 1L << 53; ; r2--) {
            if (!possible[(int)(r2 % M)]) continue;

            double r = Math.sqrt(r2);
            if (r != sqrt) {
                sqrt = r;
                r2max = r2;
                previousPoints = null;
            }
            else {
                if (previousPoints == null) previousPoints = findLatticePointsBresenham(r2max, (int)r);

                if (previousPoints.size() == 0) {
                    r2max = r2;
                    previousPoints = null;
                }
                else {
                    List<int[]> points = findLatticePointsBresenham(r2, (int)r);
                    for (int[] p1 : points) {
                        for (int[] p2 : previousPoints) {
                            if (args.length > 0) System.out.format("(%d, %d) (%d, %d)\n", p1[0], p1[1], p2[0], p2[1]);
                            count++;
                        }
                    }
                    previousPoints.addAll(points);
                    System.out.println(count);
                }
            }
        }
    }

    // Surprisingly, this seems to be faster than doing one scan for all two or three r2s.
    private static List<int[]> findLatticePointsBresenham(long r2, long r) {
        List<int[]> rv = new ArrayList<int[]>();
        // Require 0 = y = x
        long x = r, y = 0, surplus = r2 - r * r;
        while (y <= x) {
            if (surplus == 0) rv.add(new int[]{(int)x, (int)y});

            // Invariant: surplus = r2 - x*x - y*y >= 0
            y++;
            surplus -= 2*y - 1;
            if (surplus < 0) {
                x--;
                surplus += 2*x + 1;
            }
        }

        return rv;
    }
}

1

জাভা - 27,817,255

এর বেশিরভাগই এলের শোগুলির মতো এবং বাকিগুলি উপর নির্ভর করে (j,0) (k,l)। প্রত্যেকের জন্য j, আমি কিছু স্কোয়ার পিছনে চলেছি এবং পরীক্ষা করে দেখেছি যে বাকীটি কোনও মিথ্যা ধনাত্মক দেয়। এটি পুরো 25 ঘন্টা (প্রায় 0.1%) কেবলমাত্র ওভার লাভের সাথে পুরো সময় নেয় (j,0) (j,1)তবে লাভ একটি লাভ।

এটি আমার মেশিনে দশ মিনিটের মধ্যে শেষ হবে তবে আপনার কী আছে তা আমি জানি না। কারণগুলির কারণে, যদি সময় শেষ হওয়ার আগে এটি শেষ না হয় তবে এটির মারাত্মকতর খারাপ স্কোর হবে। সেক্ষেত্রে আপনি 8 লাইনটিতে বিভাজকটি টুইঙ্ক করতে পারেন যাতে এটি সময়মতো শেষ হয় (এটি কেবল নির্ধারণ করে যে এটি প্রতিটিটির জন্য কত পিছনে চলেছে j)। কিছু বিভাজনকারীদের জন্য স্কোরগুলি হ'ল:

11    27817255 (best on OPs machine)
10    27818200
8     27820719
7     27822419 (best on my machine)

প্রতিটি ম্যাচের আউটপুট চালু করতে (এবং, godশ্বর, আপনি যদি এটি করেন তবে এটি ধীর গতিতে), কেবল কোনও অসুবিধা লাইন 10 এবং 19।

public class FalsePositive {
    public static void main(String[] args){
        long j = 67108864;
        long start = System.currentTimeMillis();
        long matches=0;
        while(j < 94906265 && System.currentTimeMillis()-start < 599900){
            long jSq = j*j;
            long limit = (long)Math.sqrt(j)/11; // <- tweak to fit inside 10 minutes for best results
            matches++; // count an automatic one for (j,0)(j,1)
            //System.out.println("("+j+",0) ("+j+",1)");        
            for(int i=1;i<limit;i++){
                long k = j-i;
                long kSq = k*k;
                long l = (long)Math.sqrt(jSq-kSq);
                long lSq = l*l;
                if(kSq+lSq != jSq){
                    if(Math.sqrt(kSq+lSq)==Math.sqrt(jSq)){
                        matches++;
                        //System.out.println("("+j+",0) ("+k+","+l+")");        
                    }
                }
            }
            j++;
        }
        System.out.println("\n"+matches+" Total matches, got to j="+j);
    }
}

রেফারেন্সের জন্য, প্রথম 20 আউটপুট এটি দেয় (বিভাজক = 7 এর জন্য, (j,0)(j,1)প্রকার বাদে ):

(67110083,0) (67109538,270462)
(67110675,0) (67109990,303218)
(67111251,0) (67110710,269470)
(67111569,0) (67110668,347756)
(67112019,0) (67111274,316222)
(67112787,0) (67111762,370918)
(67115571,0) (67115518,84346)
(67117699,0) (67117698,11586)
(67117971,0) (67117958,41774)
(67120545,0) (67120040,260368)
(67121043,0) (67120118,352382)
(67122345,0) (67122320,57932)
(67122449,0) (67122444,25908)
(67122633,0) (67122328,202348)
(67122729,0) (67121972,318784)
(67122849,0) (67122568,194224)
(67124195,0) (67123818,224970)
(67125201,0) (67125172,62396)
(67125705,0) (67124632,379540)
(67126195,0) (67125882,204990)

0

জুলিয়া, 530 মিথ্যা ধনাত্মক

এখানে একটি খুব নিরীহ উদ্দীপনা অনুসন্ধান, যা আপনি একটি রেফারেন্স বাস্তবায়ন হিসাবে দেখতে পারেন।

num = 0
for i = 60000000:-1:0
    for j = i:-1:ifloor(0.99*i)
        s = i*i + j*j
        for x = ifloor(sqrt(s/2)):ifloor(sqrt(s))
            min_y = ifloor(sqrt(s - x*x))
            max_y = min_y+1
            for y = min_y:max_y
                r = x*x + y*y
                if r != s && sqrt(r) == sqrt(s)
                    num += 1
                    if num % 10 == 0
                        println("Found $num pairs")
                    end
                    #@printf("(i,j) = (%d,%d); (x,y) = (%d,%d); s = %d, r = %d\n", i,j,x,y,s,r)
                end
            end
        end
    end
end

আপনি জোড়গুলি মুদ্রণ করতে পারেন (এবং তাদের সঠিক বর্গক্ষেত্রের দৈর্ঘ্য) @printfলাইনটিকে সংকুচিত করে ।

মূলত x = y = 6e7এটি প্রথম স্থানাঙ্ক জুটির সন্ধান শুরু করে এবং এক্স হ্রাসের আগে x- অক্ষের প্রায় 1% পথ স্ক্যান করে। তারপরে এই জাতীয় প্রতিটি সমন্বিত জুটির জন্য, এটি সংঘর্ষের জন্য একই পরিমাণের (পুরো এবং উপরে নিচে) পুরো চাপটি পরীক্ষা করে।

কোডটি ধরে নিয়েছে যে এটি একটি -৪-বিট সিস্টেমে চালিত হয়েছে, যাতে ডিফল্ট পূর্ণসংখ্যা এবং ভাসমান-পয়েন্টের প্রকারগুলি -৪-বিট জাতীয় হয় (যদি না হয় তবে আপনি সেগুলি int64()এবং float64()নির্মাণকারী দিয়ে তৈরি করতে পারেন )।

এটি একটি সামান্য 530 ফলাফল দেয়।

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