ইন্টিগ্রাল ত্রিভুজ এবং অবিচ্ছেদ্য মিডিয়ানস


15

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

triangle_medians

যাক এন কিছু পূর্ণসংখ্যা ইতিবাচক হতে। কমপক্ষে একটি ইন্টিগ্রাল মিডিয়েন্ডের কম বা সমান n এর পাশের দৈর্ঘ্য সহ কতটি অ-ডিজেনারেট অখণ্ড ত্রিভুজ রয়েছে ?

চ্যালেঞ্জ

একটি প্রদত্ত সর্বাধিক পাশ দৈর্ঘ্যের জন্য অন্তত একটি অবিচ্ছেদ্য মধ্যমা দিয়ে অবিচ্ছেদ্য ত্রিভুজ সংখ্যা গনা একটি প্রোগ্রাম লিখতে এন । পাশের দৈর্ঘ্যের ক্রমটি বিবেচনা করে না, অর্থাত্ <6,6,5> <5,6,6> হিসাবে একই ত্রিভুজটি উপস্থাপন করে এবং এটি একবারে গণনা করা উচিত। ডিজেনারেটে ত্রিভুজগুলি বাদ দিন যেমন <1,2,3>।

স্কোরিং

আপনার প্রোগ্রামটি আমার মেশিনে 60 সেকেন্ডের মধ্যে ত্রিভুজগুলির সংখ্যা উত্পন্ন করতে পারে তার জন্য সবচেয়ে বড় এন আপনার স্কোর। সর্বোচ্চ স্কোর সহ প্রোগ্রামটি জিতল। আমার মেশিনটি একটি সনি ভাইও এসভিএফ 14 এ 16 সিবিবি, ইন্টেল কোর আই 5, 8 জিবি র‌্যাম।

উদাহরণ

যাক টি ( এন ) ইনপুট দিয়ে প্রোগ্রাম হতে এন

T(1) = 0
T(6) = 1
T(20) = 27
T(22) = 34

দ্রষ্টব্য যে টি (1) = টি (2) = টি (3) = টি (4) = টি (5) = 0 কারণ অবিচ্ছেদ্য দিকগুলির কোনও সংমিশ্রণ একটি ইন্টিগ্রাল মিডিয়ান ফলন করবে না। যাইহোক, একবার আমরা 6 এ পৌঁছে গেলে আমরা দেখতে পাচ্ছি যে ত্রিভুজ <5,5,6> এর মধ্যমগুলির মধ্যে একটি 4, সুতরাং টি (6) = 1।

এটিও নোট করুন যে টি (22) হ'ল প্রথম মান যেখানে দ্বিগুণ গণনা একটি ইস্যুতে পরিণত হয়: ত্রিভুজ <16,18,22> এর 13 এবং 17 (এবং 2 sqrt (85)) এর মাঝারি রয়েছে।

মিডিয়ানদের গণনা করা হচ্ছে

একটি ত্রিভুজের মধ্যমাটি নিম্নলিখিত সূত্রগুলি দ্বারা গণনা করা যেতে পারে:

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

Current top score: Sp3000 - 7000 points - C

মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
ডুরকনব

উত্তর:


7

সি, ব্রুট ফোর্স - n = 6080

এটি একটি গুরুতর প্রতিযোগী হিসাবে আরও বেসলাইন, তবে কমপক্ষে এটি শুরু করা উচিত।

n = 6080 আমার নিজের মেশিনে রানটাইমের এক মিনিটের মধ্যে যতটা উঁচুতে গেছে, এটি ইন্টেল কোর আই 5 সহ একটি ম্যাকবুক প্রো। এই মানটির জন্য আমি যে ফলাফল পেয়েছি তা হ'ল:

15041226

কোডটি নিখুঁতভাবে নিষ্ঠুর শক্তি। এটি আকারের সীমাতে সমস্ত ত্রিভুজকে গণ্য করে এবং শর্তটির জন্য পরীক্ষা করে:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

static inline int isSquare(int v) {
    int s = (int)(sqrtf((float)v) + 0.5f);
    return s * s == v;
}

static inline int isMedian(int v) {
    return v % 4 == 0 && isSquare(v / 4);
}

int main(int argc, char* argv[]) {
    int n = atoi(argv[1]);
    int nTri = 0;
    int a, b, c;

    for (c = 1; c <= n; ++c) {
        for (b = (c + 1) / 2; b <= c; ++b) {
            for (a = c - b + 1; a <= b; ++a) {
                if (isMedian(2 * (b * b + c * c) - a * a) ||
                    isMedian(2 * (a * a + c * c) - b * b) ||
                    isMedian(2 * (a * a + b * b) - c * c)) {
                    ++nTri;
                }
            }
        }
    }

    printf("%d\n", nTri);

    return 0;
}

সংকলকটির উপর নির্ভর করে আপনি 0.5f যোগ করার পরিবর্তে lrintf()বা (int)roundf()ডিফল্ট কাটা ব্যবহার করে দ্রুত + আরও ভাল-আরও কাছের পেতে পারেন । যদিও -ffast-mathকোনও একক cvtss2siনির্দেশনার সাথে সংকলন করতে আপনার এটি পেতে প্রয়োজন হয় । জিসিসি ইনলাইনস lrintf()এবং sqrtfকেবল সহ -fno-math-errno, যাতে আপনি দক্ষ asm পান: Godbolt.org/g/E3hncQ । (আমি ব্যবহার করেছি -march=ivybridgeকারণ এটি ওপি'র সিপিইউ)। এর সাথে -ffast-math, ঝনঝন স্কয়ারটি একটি আরএসকিআর্ট + নিউটন পুনরাবৃত্তিতে রূপান্তরিত করে; আইডিকে যদি এটি জয় হয়।
পিটার কর্ডেস

উফ, সাধারণত না roundf। ইনলাইন না (int)nearbyintf()থাকলে ব্যবহার করুন lrintf(), কারণ এটি নির্দিষ্ট অদ্ভুতের পরিবর্তে বর্তমান রাউন্ডিং মোড ব্যবহার করে। stackoverflow.com/questions/37620659/…
পিটার

6

সি, প্রায় 6650 6900

#include <math.h>
#include <stdio.h>
#include <stdlib.h>

static inline int is_square(int n) {
    if ((n&2) != 0 || (n&7) == 5 || (n&11) == 8) {
        return 0;
    }

    int s = (int) (sqrtf((float) n) + 0.5f);
    return (s*s == n);
}

int main(int argc, char **argv) {
    int n = atoi(argv[1]);
    int count = 0;

    for (int a = 1; a <= n; ++a) {
        if (a&1) {
            for (int b = (a+1)/2; b <= a; ++b){
                if (b&1) {
                    for (int c = a-b+2; c <= b; c += 2) {
                        if (is_square((a*a + b*b)/2 - (c*c)/4)) {
                            ++count;
                        }
                    }
                } else {
                    for (int c = a-b+2; c <= b; c += 2) {
                        if (is_square((a*a + c*c)/2 - (b*b)/4)) {
                            ++count;
                        }
                    }
                }
            }
        } else {
            for (int b = (a+1)/2; b <= a; ++b){
                if (b&1) {
                    for (int c = a-b+2; c <= b; c += 2) {
                        if (is_square((b*b + c*c)/2 - (a*a)/4)) {
                            ++count;
                        }
                    }
                } else {
                    for (int c = a-b+2; c <= b; c += 2) {
                        if (is_square((b*b + c*c)/2 - (a*a)/4) ||
                            is_square((c*c + a*a)/2 - (b*b)/4) ||
                            is_square((a*a + b*b)/2 - (c*c)/4)) {
                            ++count;
                        }
                    }
                }
            }
        }
    }

    printf("%d\n", count);
    return 0;
}

আমি প্রায়শই সি ব্যবহার করি না, তবে পাটিগণিতের পরিমাণের সাথে এটি ভাষার ভাল পছন্দ বলে মনে হয়েছিল। মূল অ্যালগরিদম হ'ল রেটোকোড়াদির উত্তরের মতো নির্মম শক্তি , তবে কয়েকটি সহজ আশাবাদ। আমি নিশ্চিত নই যে আমাদের মানগুলি তুলনাযোগ্য, কারণ @ রেটোকোরাদির কম্পিউটারটি আমার চেয়ে দ্রুততর বলে মনে হচ্ছে।

প্রধান অপ্টিমাইজেশন হ'ল চেকটিকে পুরোপুরি বাইপাস করা % 4। একটি পূর্ণসংখ্যার বর্গ n*nহয় 0 বা 1 মডিউল 4 হয়, nনিজে 0 বা 1 মডুলো 2 হয় তার উপর নির্ভর করে এইভাবে, আমরা এর জন্য সমস্ত সম্ভাবনার দিকে একবার নজর দিতে পারি (x, y, z) % 2:

x%2  y%2  z%2    (2*(x*x+y*y) - z*z) % 4
----------------------------------------
 0    0    0              0
 0    0    1              3
 0    1    0              2
 0    1    1              1
 1    0    0              2
 1    0    1              1
 1    1    0              0
 1    1    1              3

সুবিধার্থে, কেবল দুটি ক্ষেত্রে বিবেচনা করতে হবে: (0, 0, 0)এবং (1, 1, 0), যা প্রথম দুটি পক্ষ দেওয়া a, b, তৃতীয় পক্ষের সমতুল্য cহওয়ার সমতুল্য a^b:

 a%2   b%2         c%2 must be
 -----------------------------
  0     0               0
  0     1               1
  1     0               1
  1     1               0

a^bএকই সমতুল্যতা a-b, সুতরাং c = a-b+11 এস দ্বারা অনুসন্ধান করা এবং উপরে যাওয়ার চেয়ে এটি আমাদের সন্ধান c = a-b+2করতে এবং 2 এস-এ যেতে দেয়।

আরেকটি অপ্টিমাইজেশন আসল সত্য থেকে আসে যে, (1, 1, 0)কেবলমাত্র একটির ক্রমশক্তি কাজ করার পরে, কেবলমাত্র আমাদের কেবল একবার_স্কোয়ার কল করতে হবে। এটি অনুসন্ধানে নিবন্ধন করে কোডে বিশেষ মামলা করা হয়।

অন্তর্ভুক্ত অন্যান্য অপ্টিমাইজেশন হ'ল ফাংশনটিতে একটি দ্রুতগতিযুক্ত is_square

সংকলন দিয়ে করা হয়েছিল -std=c99 -O3

(ডেট রূপান্তর সংঘটিত 0.5হতে না পারার জন্য_ইস্কোয়ার হওয়া দরকার বলে চিহ্নিত করার জন্য @ রিটোকোরাদিকে ধন্যবাদ জানাই 0.5f))


1
খুব ছোটখাট, কিন্তু আপনি ব্যবহার করতে পারেন 0.5fপরিবর্তে 0.5মধ্যে is_square()0.5ধরনের ধ্রুবক doubleতাই অভিব্যক্তি যখন আপনি যোগ একটি ডবল মান উত্পাদন করা হবে, 0.5থেকে টাইপ রূপান্তর সহ, floatকরতে doubleঅন্যান্য মেয়াদে।
মিনিটে রেটো কোরাদি

@ রিটোকোরাদি আহ ধন্যবাদ - এটি আশ্চর্যজনকভাবে নাবালিকা ছিল f, আসলে এটি।
Sp3000

2

ফেলিক্স, অজানা

fun is_square(v: int) => let s = int$ sqrt$ v.float + 0.5f in s*s == v;
fun is_median(v: int) => v % 4 == 0 and (v/4).is_square;

proc main() {
    n := int$ System::argv 1;
    var ntri = 0;

    for var c in 1 upto n do
        for var b in (c+1)/2 upto c do
            for var a in c - b + 1 upto b do
                if is_median(2*(b*b+c*c)-a*a) or
                   is_median(2*(a*a+c*c)-b*b) or
                   is_median(2*(a*a+b*b)-c*c) do ++ntri; done
            done
        done
    done

    ntri.println;
}

main;

মূলত সি উত্তর পোর্ট, কিন্তু এটা আরো দ্রুত তুলনায় এটি, সাথে পরীক্ষিত এর clang -O3এবং icc -O3। ফেলিক্স এবং নিম কেবলমাত্র দুটি ভাষা যা আমি জানি সেগুলি সি এবং সি ++ কে বেঞ্চমার্কে পরাজিত করতে পারে। আমি একটি সমান্তরাল সংস্করণে কাজ করছি, তবে এটি শেষ না হওয়া পর্যন্ত এটি কিছুটা হবে, সুতরাং আমি এটি পোস্ট করার সিদ্ধান্ত নিয়েছি।

আমি "অজানা "ও রেখেছি কারণ আমার কম্পিউটার অগত্যা পৃথিবীর সবচেয়ে দ্রুত নয় ...

কমান্ডটি নির্মাণ করতে ব্যবহৃত হয়:

flx --usage=hyperlight -c --static -o sl0 sl0.flx

উত্পন্ন সি ++ দেখতে আকর্ষণীয়:

//Input file: /home/ryan/golf/itri/sl0/sl0.flx
//Generated by Felix Version 15.04.03
//Timestamp: 2015/7/16 20:59:42 UTC
//Timestamp: 2015/7/16 15:59:42 (local)
#define FLX_EXTERN_sl0 FLX_EXPORT
#include "sl0.hpp"
#include <stdio.h>
#define comma ,

//-----------------------------------------
//EMIT USER BODY CODE
using namespace ::flxusr::sl0;

//-----------------------------------------
namespace flxusr { namespace sl0 {

//-----------------------------------------
//DEFINE OFFSET tables for GC
#include "sl0.rtti"
FLX_DEF_THREAD_FRAME
//Thread Frame Constructor
thread_frame_t::thread_frame_t(
) :
  gcp(0),
  shape_list_head(&thread_frame_t_ptr_map)
{}

//-----------------------------------------
//DEFINE FUNCTION CLASS METHODS
#include "sl0.ctors_cpp"
//------------------------------
//C PROC <61624>: _init_
void _init_(FLX_APAR_DECL_ONLY){
  int _i63436_v63436_s;
  int _i63435_v63435_s;
  int s;
  int a;
  int b;
  int c;
  int ntri;
  int n;
      n = static_cast<int>(::std::atoi((::std::string(1<0||1>=PTF argc?"":PTF argv[1])).c_str())); //assign simple
      ntri = 0; //assign simple
      c = 1; //assign simple
    _63421:;
      if(FLX_UNLIKELY((n < c))) goto _63428;
      b = (c + 1 ) / 2 ; //assign simple
    _63422:;
      if(FLX_UNLIKELY((c < b))) goto _63427;
      a = (c - b ) + 1 ; //assign simple
    _63423:;
      if(FLX_UNLIKELY((b < a))) goto _63426;
/*begin match*/
/*match case 1:s*/
      s  = static_cast<int>((::std::sqrt(((static_cast<float>(((2 * (b * b  + (c * c ) )  - (a * a ) ) / 4 ))) + 0.5f ))))/*int.flx: ctor*/; //init
/*begin match*/
/*match case 1:s*/
      _i63435_v63435_s  = static_cast<int>((::std::sqrt(((static_cast<float>(((2 * (a * a  + (c * c ) )  - (b * b ) ) / 4 ))) + 0.5f ))))/*int.flx: ctor*/; //init
/*begin match*/
/*match case 1:s*/
      _i63436_v63436_s  = static_cast<int>((::std::sqrt(((static_cast<float>(((2 * (a * a  + (b * b ) )  - (c * c ) ) / 4 ))) + 0.5f ))))/*int.flx: ctor*/; //init
      if(!((((2 * (b * b  + (c * c ) )  - (a * a ) ) % 4  == 0) && (s * s  == (2 * (b * b  + (c * c ) )  - (a * a ) ) / 4 )  || (((2 * (a * a  + (c * c ) )  - (b * b ) ) % 4  == 0) && (_i63435_v63435_s * _i63435_v63435_s  == (2 * (a * a  + (c * c ) )  - (b * b ) ) / 4 ) ) ) || (((2 * (a * a  + (b * b ) )  - (c * c ) ) % 4  == 0) && (_i63436_v63436_s * _i63436_v63436_s  == (2 * (a * a  + (b * b ) )  - (c * c ) ) / 4 ) ) )) goto _63425;
      {
      int* _tmp63490 = (int*)&ntri;
      ++*_tmp63490;
      }
    _63425:;
      if(FLX_UNLIKELY((a == b))) goto _63426;
      {
      int* _tmp63491 = (int*)&a;
      ++*_tmp63491;
      }
      goto _63423;
    _63426:;
      if(FLX_UNLIKELY((b == c))) goto _63427;
      {
      int* _tmp63492 = (int*)&b;
      ++*_tmp63492;
      }
      goto _63422;
    _63427:;
      if(FLX_UNLIKELY((c == n))) goto _63428;
      {
      int* _tmp63493 = (int*)&c;
      ++*_tmp63493;
      }
      goto _63421;
    _63428:;
      {
      _a12344t_63448 _tmp63494 = ::flx::rtl::strutil::str<int>(ntri) + ::std::string("\n") ;
      ::flx::rtl::ioutil::write(stdout,_tmp63494);
      }
}

//-----------------------------------------
}} // namespace flxusr::sl0
//CREATE STANDARD EXTERNAL INTERFACE
FLX_FRAME_WRAPPERS(::flxusr::sl0,sl0)
FLX_C_START_WRAPPER_PTF(::flxusr::sl0,sl0,_init_)

//-----------------------------------------
//body complete

2

সি # (প্রায় 11000?)

using System;
using System.Collections.Generic;

namespace PPCG
{
    class PPCG53100
    {
        static void Main(string[] args)
        {
            int n = int.Parse(args[0]);
            Console.WriteLine(CountOOE(n) + CountEEE(n));
        }

        static int CountOOE(int n)
        {
            // Maps from a^2 + b^2 to (b - a, a + b), which are the exclusive bounds on c.
            IDictionary<int, List<Tuple<int, int>>> pairs = new Dictionary<int, List<Tuple<int, int>>>();

            for (int a = 1; a <= n; a += 2)
            {
                int k = 2 * a * a;
                for (int b = a; b <= n; b += 2, k += 4 * (b - 1))
                {
                    List<Tuple<int, int>> prev;
                    if (!pairs.TryGetValue(k, out prev)) pairs[k] = prev = new List<Tuple<int, int>>();
                    prev.Add(Tuple.Create(b - a, a + b));
                }
            }

            int max = 2 * n * n;
            int count = 0;
            for (int x = 1; x <= n >> 1; x++)
            {
                int k = 4 * x * x;
                for (int y = x; y <= n; y++, k += 4 * y - 2)
                {
                    if (k > max) break;
                    List<Tuple<int, int>> ab;
                    if (pairs.TryGetValue(k, out ab))
                    {
                        foreach (var pair in ab)
                        {
                            // Double-counting isn't possible if a, b are odd.
                            if (pair.Item1 < x << 1 && x << 1 < pair.Item2)
                            {
                                count++;
                            }
                            if (x != y && y << 1 <= n && pair.Item1 < y << 1 && y << 1 < pair.Item2)
                            {
                                count++;
                            }
                        }
                    }
                }
            }

            return count;
        }

        static int CountEEE(int n)
        {
            // Maps from a^2 + b^2 to (b - a, a + b), which are the exclusive bounds on c.
            IDictionary<int, List<Tuple<int, int>>> pairs = new Dictionary<int, List<Tuple<int, int>>>();

            for (int a = 2; a <= n; a += 2)
            {
                int k = 2 * a * a;
                for (int b = a; b <= n; b += 2, k += 4 * (b - 1))
                {
                    List<Tuple<int, int>> prev;
                    if (!pairs.TryGetValue(k, out prev)) pairs[k] = prev = new List<Tuple<int, int>>();
                    prev.Add(Tuple.Create(b - a, a + b));
                }
            }

            // We want to consider m in the range [1, n] and c/2 in the range [1, n/2]
            // But to save dictionary lookups we can scan x in [1, n/2], y in [x, n] and consider both ways round.
            int max = 2 * n * n;
            int count = 0;
            for (int x = 1; x <= n >> 1; x++)
            {
                int k = 4 * x * x;
                for (int y = x; y <= n; y++, k += 4 * y - 2)
                {
                    if (k > max) break;
                    List<Tuple<int, int>> ab;
                    if (pairs.TryGetValue(k, out ab))
                    {
                        foreach (var pair in ab)
                        {
                            // (c1, m1) = (2x, y)
                            // (c2, m2) = (2y, x)

                            int a = (pair.Item2 - pair.Item1) / 2, b = (pair.Item2 + pair.Item1) / 2;
                            int c1 = 2 * x;

                            if (pair.Item1 < c1 && c1 < pair.Item2)
                            {
                                // To deduplicate: the possible sets of integer medians are:
                                //     m_c
                                //     m_a, m_c
                                //     m_b, m_c
                                //     m_a, m_b, m_c
                                // We only want to add if c is (wlog) the shortest edge whose median is integral (or joint integral in case of isosceles triangles).

                                if (c1 <= a) count++;
                                else if (!IsIntegerMedian(b, c1, a))
                                {
                                    if (c1 <= b || !IsIntegerMedian(a, c1, b)) count++;
                                }
                            }

                            int c2 = 2 * y;
                            if (c1 != c2 && c2 <= n && pair.Item1 < c2 && c2 < pair.Item2)
                            {
                                if (c2 <= a) count++;
                                else if (!IsIntegerMedian(b, c2, a))
                                {
                                    if (c2 <= b || !IsIntegerMedian(a, c2, b)) count++;
                                }
                            }
                        }
                    }
                }
            }

            return count;
        }

        private static bool IsIntegerMedian(int a, int b, int c)
        {
            int m2 = 2 * (a * a + b * b) - c * c;
            int s = (int)(0.5f + Math.Sqrt(m2));
            return ((s & 1) == 0) && (m2 == s * s);
        }
    }
}

n কমান্ড-লাইন আর্গুমেন্ট হিসাবে নেওয়া হয়।

ব্যাখ্যা

মি=(2একটি2+ +22-2)/4 যত 2একটি2+ +22=4মি2+ +2এটি যেখান থেকে স্পষ্ট 2 সমান হতে হবে, এবং তাই এমনকি. দিন=2সি এবং আমরা আবার লিখি একটি2+ +2=2(মি2+ +সি2)। অতএবএকটি2+ +2 সমান হতে হবে, তাই একটি এবং একই সমতা থাকতে হবে।

সমীকরণটি একটি2+ +2=2(মি2+ +সি2) এখানে নিযুক্ত মধ্যম অ্যালগরিদমের জন্য ভিত্তি।

যদি একটি এবং অদ্ভুত তবে আমাদের দ্বিগুণ গণনার ঝুঁকি নেই, কারণ তিনটি মধ্যমাধ্যায়ের মধ্যে কেবল একটিই অবিচ্ছেদ্য হতে পারে। তিনটিই যদি হয় তবে আমাদের দ্বিগুন গণনা থেকে সাবধান থাকা দরকার। অতএব আমি দুটি কেস পৃথকভাবে পরিচালনা করি যাতে বিজোড়-বিজোড়-এমনকি কেস এমনকি সম-এমনকি-এমনকি মামলার চেয়ে দ্রুত প্রক্রিয়া করা যায়।


আমি আমার মেশিনে ফেলিক্স তৈরি করতে পারি না, তবে আমার সময়গুলি n=5000রেটো কোড়াদির উত্তরের জন্য 67 সেকেন্ড, স্প 3000 এর উত্তরের জন্য 48 সেকেন্ড এবং আমার উত্তরটির জন্য 13 সেকেন্ড।
পিটার টেলর

0

সি, এন = 3030 এখানে

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

#define R     return
#define u32 unsigned
#define F        for
#define P     printf

int isq(u32 a)
{u32 y,x,t,i;
 static u32  arr720[]={0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289,324,361,400,441,484,529,576,625,676,180,241,304,369,436,505,649,160,409,496,585,340,544,145,601,244,580,481,640,385,265};
 static char barr[724]={0};
 if(barr[0]==0)F(i=0;i<(sizeof arr720)/sizeof(unsigned);++i)
                if(arr720[i]<720) barr[arr720[i]]=1; 
 if(barr[a%720]==0) R 0;
 y=sqrt(a);
 R y*y==a;
}

int f(u32 a, u32 b, u32 c)
{u32 t,x;
 if(c&1)R 0;
 t= a*a+b*b;
 if(t&1)R 0;
 R isq((2*t-c*c)/4);
}

int h(u32 n)
{u32 cnt,a,c,k,ke,kc,d,v,l,aa,bb,cc;

 cnt=0;
 F(a=1;a<=n;++a)
   {ke=(n-a)/2;
    F(k=0;k<=ke;++k)
        {v=a+k;
         d=v*v+k*k;
         l=sqrt(d);
         v=n/2;
         if(l>v)l=v;
         v=a+k-1;
         if(l>v)l=v;
         F(c=k+1;c<=l;++c)
           {if(isq(d-c*c))
                {bb=a+2*k;cc=2*c;
                 if(bb>cc && f(a, cc,bb)) continue;
                 if( a>cc && f(cc,bb, a)) continue;
                 ++cnt;
                 //P("|a=%u b=%u c=%u", a, bb, cc);
                }
           }
        }
   }
 R cnt; 
}

int main(int c, char** a)
{time_t  ti, tf;
 double   d;
 int     ni;
 u32    n,i;

 if(c!=2||a[1]==0){P("uso: questo_programma.exe  arg1\n ove arg1 e\' un numero positivo\n");R 0;}
 ni=atoi(a[1]);
 if(ni<=0){P("Parametro negativo o zero non permesso\n");R 0;}
 n=ni;
 if(n>0xFFFFF){P("Parametro troppo grande non permesso\n"); R 0;}
 F(i=3;i<33;++i)if(i<10||i>21)P("T(%u)=%u|",i, h(i));
 ti=time(0);
 P("\nT(%u)=%u\n", n, h(n));
 tf=time(0);
 d=difftime(tf,ti);
 P("Tempo trascorso = %.2f sec\n", d); 
 R 1;
}

ফলাফল:

C:\Users\a\b>prog 3030
T(3)=0|T(4)=0|T(5)=0|T(6)=1|T(7)=1|T(8)=2|T(9)=3|T(22)=34|T(23)=37|T(24)=42|T(25)=
45|T(26)=56|T(27)=59|T(28)=65|T(29)=67|T(30)=74|T(31)=79|T(32)=91|
T(3030)=3321226
Tempo trascorso = 60.00 sec

উপরের কোডটি অ্যাক্সিয়াম উত্তরের সিতে ট্র্যাসলেশন হবে (যদি আমরা ইস্ক () ফাংশনটি গণনা করি না)।

আমার সংকলক একটি ফাংশন লিঙ্ক করে না অন্যরা স্কয়ারটিএফ () ব্যবহার করে ... এখানে ভাসমানের জন্য কোনও স্কয়ার্ট ফাংশন নেই ... তারা কি নিশ্চিত যে স্কয়ারটিএফ এটি কোনও সি স্ট্যান্ডার্ড ফাংশন?



0

এপিএল NARS, 59 সেকেন্ডে n = 239 282

f←{(a b c)←⍵⋄1=2∣c:0⋄t←+/a b*2⋄1=2∣t:0⋄0=1∣√4÷⍨(2×t)-c*2}

∇r←g n;cnt;c;a;k;kc;ke;d;l;bb;cc
    r←⍬⋄cnt←0
    :for a :in 1..n 
       ke←⌊(n-a)÷2
       :for k :in 0..ke
          d←((a+k)*2)+k*2
          kc←⌊⌊/(n÷2),(a+k-1),√d
          →B×⍳kc<k+1  
          :for c :in (k+1)..kc
            →C×⍳∼1e¯9>1∣√d-c*2
               bb←a+2×k⋄cc←2×c
               →C×⍳(bb>cc)∧f a  cc bb
               →C×⍳( a>cc)∧f cc bb  a
               cnt+←1
               ⍝r←r,⊂a bb cc
   C:     :endfor
   B:  :endfor
    :endfor
    r←r,cnt
∇

(আমি এপিএলে অক্ষিম উত্তরটি ট্র্যাসলেট করি) পরীক্ষায়:

  g 282 
16712 
  v←5 6 10 20 30 41
  v,¨g¨v
5 0  6 1  10 4  20 27  30 74  41 166 

0

Axiom, n = 269 59 সেকেন্ডে

isq?(x:PI):Boolean==perfectSquare?(x)

f(a:PI,b:PI,c:PI):Boolean==
    c rem 2=1=>false
    t:=a^2+b^2
    t rem 2=1=>false
    x:=(2*t-c^2)quo 4
    isq?(x)

h(n)==
   cnt:=0  -- a:=a   b:=(a+2*k)  c:=
   r:List List INT:=[]
   for a in 1..n repeat
     ke:=(n-a)quo 2
     for k in 0..ke repeat
         d:=(a+k)^2+k^2 -- (a^2+b^2)/2=(a+k)^2+k^2   m^2+c^2=d
         l:=reduce(min,[sqrt(d*1.), n/2.,a+k-1])
         kc:=floor(l)::INT
         for c in k+1..kc repeat
             if isq?(d-c^2) then
                            bb:=a+2*k; cc:=2*c
                            if bb>cc and f(a,cc,bb) then iterate   -- 2<->3
                            if  a>cc and f(cc,bb,a) then iterate   -- 1<->3
                            cnt:=cnt+1
                            --r:=cons([a,a+2*k,2*c],r)
   r:=cons([cnt],r)
   r

যদি a, b, cx সর্বাধিক দৈর্ঘ্যের পাশের ত্রিভুজের পাশের দৈর্ঘ্য হয় ...

আমরা জানব যে এম: = স্কয়ার্ট ((2 * (a ^ 2 + বি ^ 2) -সিএক্স ^ 2) / 4)

(1) m^2=(2*(a^2+b^2)-cx^2)/4

পিটার টেলর যেমন বলেছিলেন, 4 | (2 * (a ^ 2 + b ^ 2) -cx ^ 2) এবং কারণ 2 | 2 * (a ^ 2 + b ^ 2) 2 | cx ^ 2 => cx = 2 * গ। সুতরাং 1 থেকে হবে

(2) m^2=(a^2+b^2)/2-c^2

ক, এবং খ একই সমতা থাকতে হবে, তাই আমরা একটি এর ফাংশন খ লিখতে পারে

(3) a:=a   b:=(a+2*k)

আমাদের চেয়ে যে আছে

(4)(a^2+b^2)/2=(a^2+(a+2*k)^2)/2=(a+k)^2+k^2

সুতরাং (1) পুনরায় লেখা যেতে পারে (2) (3) (4) হিসাবে এটি:

m^2+c^2=(a+k)^2 + k^2=d         a:=a  b:=(a+2*k)  cx:=2*c

কোথায়

a in 1..n  
k in 0..(n-a)/2  
c in k+1..min([sqrt(d*1.), n/2.,a+k-1])

ফলাফল

(16) -> h 269
   (16)  [[14951]]
                                                  Type: List List Integer
        Time: 19.22 (IN) + 36.95 (EV) + 0.05 (OT) + 3.62 (GC) = 59.83 sec

0

দশ সেকেন্ডে ভিবিএ 15,000!

এই অন্যান্য পোস্টের পরে আমি অনেক কম প্রত্যাশা করেছি। 16 গিগাবাইট র‌্যাম সহ একটি ইন্টেল 7 এ আমি 10 সেকেন্ডে 13-15,000 পাই। 4 জিবি র‌্যাম সহ একটি পেন্টিয়ামে, আমি টিএন সেকেন্ডে 5-7,000 পাই। কোডটি নীচে রয়েছে। পেন্টিয়ামের সর্বশেষ ফলাফল এখানে

abci= 240, 234, 114, 7367, 147
abci= 240, 235, 125, 7368, 145
abci= 240, 236, 164, 7369, 164
abci= 240, 238, 182, 7370, 221
abci= 240, 239, 31, 7371, 121

এটি 240, 239, 31 এবং 121 এর একটি মাধ্যম সহ একটি ত্রিভুজ পর্যন্ত উঠেছে medium মাঝারিগুলির গণনা 7,371 is

Sub tria()
On Error Resume Next
Dim i As Long, a As Integer, b As Integer, c As Integer, ma As Double, mb As Double, mc As Double, ni As Long, mpr As Long
Dim dtime As Date
dtime = Now
Do While Now < DateAdd("s", 10, dtime)  '100 > DateDiff("ms", dtime, Now) '
    a = a + 1
   ' Debug.Assert a < 23
    b = 1: c = 1
    Do
        ma = 0
        If a < b + c And b < a + c And c < a + b Then
            ma = ((2 * b ^ 2 + 2 * c ^ 2 - a ^ 2) / 4) ^ 0.5
            If ma <> 0 Then ni = i + 1 * -1 * (0 = ma - Fix(ma))
                If ni > i Then
                If ma <> mpr Then
                i = ni
                mpr = ma
                    Debug.Print "abci= " & a & ", " & b & ", " & c & ", " & i & ", " & ma
                    GoTo NextTri  'TO AVOID DOUBLE COUNTING
                End If
            End If
       'End If

        mb = 0
        'If b < a + c Then
            mb = ((2 * a ^ 2 + 2 * c ^ 2 - b ^ 2) / 4) ^ 0.5
            If mb <> 0 Then ni = i + 1 * -1 * (0 = mb - Fix(mb))
            If ni > i Then
            If mb <> mpr Then
                i = ni
                mpr = mb
                Debug.Print "abci= " & a & ", " & b & ", " & c & ", " & i & ", " & mb
                GoTo NextTri  'TO AVOID DOUBLE COUNTING
            End If
            End If
        'End If

        mc = 0
        'IfThen
            mc = ((2 * b ^ 2 + 2 * a ^ 2 - c ^ 2) / 4) ^ 0.5
            If mc <> 0 Then ni = i + 1 * -1 * (0 = mc - Fix(mc))
            If ni > i Then
            If mc <> mpr Then
            i = ni
            mpr = mc
                Debug.Print "abci= " & a & ", " & b & ", " & c & ", " & i & ", " & mc
            End If
            End If
        End If
NextTri:
        Do While c <= b
            'c = c + 1
            ma = 0
            If a < b + c And b < a + c And c < a + b Then

                    ma = ((2 * b ^ 2 + 2 * c ^ 2 - a ^ 2) / 4) ^ 0.5
                    If ma <> 0 Then ni = i + 1 * -1 * (0 = ma - Fix(ma))
                            If ni > i Then
                    If ma <> mpr Then
                        mpr = ma
                i = ni
                    End If
                    Debug.Print "abci= " & a & ", " & b & ", " & c & ", " & i & ", " & ma
                    GoTo NextTri2  'TO AVOID DOUBLE COUNTING
                End If
            'End If

            mb = 0
            'If b < a + c Then
                mb = ((2 * a ^ 2 + 2 * c ^ 2 - b ^ 2) / 4) ^ 0.5
                If mb <> 0 Then ni = i + 1 * -1 * (0 = mb - Fix(mb))
                        If ni > i Then
                If mb <> mpr Then
                mpr = mb
                i = ni
                    Debug.Print "abci= " & a & ", " & b & ", " & c & ", " & i & ", " & mb
                    GoTo NextTri2  'TO AVOID DOUBLE COUNTING
                End If
                End If
            'End If

            mc = 0
            'If c < b + a Then
                    mc = ((2 * b ^ 2 + 2 * a ^ 2 - c ^ 2) / 4) ^ 0.5
                    If mc <> 0 Then ni = i + 1 * -1 * (0 = mc - Fix(mc))
                            If ni > i Then
                    If mc <> mpr Then
                    mpr = mc
                i = ni
                    Debug.Print "abci= " & a & ", " & b & ", " & c & ", " & i & ", " & mc
                    End If
                End If
            End If
       ' Debug.Print "abci= " & a & ", " & b & ", " & c & ", " & i
            c = c + 1
        Loop 'While c <= a
NextTri2:
        b = b + 1
        c = 1
    Loop While b <= a
Loop
Debug.Print i

End Sub

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