इंटीग्रल त्रिकोण और इंटीग्रल मेडियंस


15

एक त्रिभुज ABC पर विचार करें जहां प्रत्येक पक्ष में पूर्णांक लंबाई (एक अभिन्न त्रिभुज ) है। एक परिभाषित मंझला की एबीसी विरोधी पक्ष के मध्य करने के लिए एक शीर्ष से एक रेखा खंड होने के लिए। नीचे दिए गए आंकड़े में, रेड लाइन सेगमेंट मध्यस्थों का प्रतिनिधित्व करते हैं। ध्यान दें कि किसी भी त्रिकोण में तीन माध्यिकाएं हैं।

triangle_medians

चलो n कुछ पूर्णांक सकारात्मक हो। प्रत्येक पक्ष लंबाई के साथ कितने गैर-पतित इंटीग्रल त्रिभुज हैं जो n से कम या बराबर हैं, जिसमें कम से कम एक अभिन्न मध्य है?

चुनौती

दिए गए अधिकतम पक्ष लंबाई n के लिए कम से कम एक अभिन्न मंझला के साथ अभिन्न त्रिकोण की संख्या की गणना करने के लिए एक कार्यक्रम लिखें । साइड की लंबाई का क्रम मायने नहीं रखता है, <<6,6,5> उसी त्रिकोण का प्रतिनिधित्व करता है <5,6,6> और केवल एक बार गिना जाना चाहिए। पतित त्रिकोण जैसे <1,2,3> को छोड़ दें।

स्कोरिंग

सबसे बड़ा n जिसके लिए आपका प्रोग्राम 60 सेकंड में मेरी मशीन पर त्रिकोण की संख्या उत्पन्न कर सकता है, वह आपका स्कोर है। उच्चतम स्कोर जीत के साथ कार्यक्रम। मेरी मशीन Sony Vaio SVF14A16CLB, Intel Core i5, 8GB RAM है।

उदाहरण

बता दें कि T ( N ) इनपुट N वाला प्रोग्राम है ।

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

ध्यान दें कि टी (1) = टी (2) = टी (3) = टी (4) = टी (5) = 0 क्योंकि अभिन्न पक्षों का कोई संयोजन एक अभिन्न मंझला नहीं होगा। हालाँकि, एक बार जब हम 6 में पहुँच जाते हैं, तो हम देख सकते हैं कि त्रिभुज के माध्यकों में से एक <5,5,6> 4 है, इसलिए T (6) = 1।

ध्यान दें कि टी (22) पहला मूल्य है जिस पर डबल-गिनती एक मुद्दा बन जाती है: त्रिकोण <16,18,22> में 13 और 17 (और 2 वर्ग) (85) हैं।

मध्यस्थों की गणना करना

एक त्रिभुज के माध्यकों की गणना निम्नलिखित सूत्रों द्वारा की जा सकती है:

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

Current top score: Sp3000 - 7000 points - C

टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
दरवाज़े

जवाबों:


7

सी, जानवर बल - एन = 6080

यह एक गंभीर दावेदार की तुलना में अधिक आधारभूत है, लेकिन कम से कम इसे शुरू करना चाहिए।

n = 6080 उतना ही अधिक है जितना मुझे अपनी मशीन पर रनटाइम के एक मिनट में मिला, जो कि Intel Core 55 के साथ मैकबुक प्रो है। इस मूल्य के लिए मुझे जो परिणाम मिला है वह है:

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निर्देश के संकलन के लिए उपयोग करने की आवश्यकता होती है , हालांकि। gcc inlines lrintf()और sqrtfकेवल साथ ही -fno-math-errno, इसलिए आपको कुशल एएसएम: godbolt.org/g/E3hncQ मिलता है । (मैंने इस्तेमाल किया -march=ivybridgeक्योंकि वह ओपी का सीपीयू है)। के साथ -ffast-math, क्लैंग sqrt को rsqrt + न्यूटन पुनरावृत्ति में बदल देता है; अगर जीत है तो IDK।
पीटर कॉर्ड्स

उफ़, आमतौर पर नहीं 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+1और 1s से ऊपर जाने के बजाय , यह हमें c = a-b+22s से खोज और ऊपर जाने देता है ।

एक और अनुकूलन इस तथ्य से आता है कि, (1, 1, 0)मामले के लिए, हमें केवल एक क्रमिक कार्यों के बाद से एक बार is_square को कॉल करना होगा। यह खोज को अनियंत्रित करके कोड में विशेष आवरण है।

शामिल अन्य अनुकूलन बस is_squareसमारोह में एक त्वरित है ।

के साथ संकलन किया गया था -std=c99 -O3

(यह इंगित करने के लिए @RetoKoradi का धन्यवाद कि 0.5is_square 0.5fको किसी स्थान पर दोहरे रूपांतरण से बचने के लिए आवश्यक है।)


1
बहुत मामूली है, लेकिन आप उपयोग कर सकते हैं 0.5fके बजाय 0.5में is_square()0.5प्रकार की एक निरंतर है doubleतो अभिव्यक्ति जब आप जोड़ने के एक डबल मूल्य का उत्पादन करेगा, 0.5से जैसे रूपांतरण सहित, floatके लिए doubleअन्य अवधि के लिए।
रेटो कोराडी

@RetoKoradi आह धन्यवाद - यह एक आश्चर्यजनक रूप से मामूली नहीं था 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। फेलिक्स और निम वस्तुतः केवल दो भाषाएं हैं जिनके बारे में मुझे पता है कि बेंचमार्क पर C और C ++ को हरा सकते हैं। मैं एक समानांतर संस्करण पर काम कर रहा हूं, लेकिन जब तक यह समाप्त नहीं हो जाता, तब तक यह थोड़ा सा होगा, इसलिए मैंने इसे आगे पोस्ट करने का फैसला किया।

मैंने "अज्ञात" भी डाला क्योंकि मेरा कंप्यूटर पृथ्वी पर सबसे तेज़ नहीं है ...

बनाने के लिए इस्तेमाल किया कमान:

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

C # (लगभग 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 कमांड-लाइन तर्क के रूप में लिया जाता है।

व्याख्या

=(22+22-सी2)/422+22=42+सी2सी2सीसी=2सी2+2=2(2+सी2)2+2

2+2=2(2+सी2)


मैं अपनी मशीन पर फेलिक्स का निर्माण नहीं कर सकता, लेकिन n=5000रेटो कोराडी के जवाब के लिए मेरा समय 67 सेकंड, Sp3000 के जवाब के लिए 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

उपरोक्त कोड Axiom उत्तर के C (यदि हम isq () फ़ंक्शन को नहीं गिनते हैं) में रद्दीकरण होगा।

मेरे कंपाइलर एक फ़ंक्शन को लिंक नहीं करते हैं जो दूसरों को sqrtf () का उपयोग करते हैं ... यहां फ्लोट के लिए कोई sqrt फ़ंक्शन नहीं है ... क्या उन्हें यकीन है कि sqrtf यह एक C मानक फ़ंक्शन है?



0

APL NARS, n = 239 282 59 सेकंड में

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
∇

(मैं APL में Axiom जवाब एक को मिटा देता हूं) टेस्ट:

  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

59 सेकंड में Axiom, n = 269

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 अधिकतम लम्बाई वाले साइड n के एक त्रिभुज की भुजाओं की लंबाई है ...

हम जानते हैं कि m: = sqrt ((2 * (^ 2 + b ^ 2) -cx ^ 2) / 4)

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

जैसा कि पीटर टेलर ने कहा था, 4 | (2 * (^ 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

a और b में समान समानता है, इसलिए हम a के कार्य में b लिख सकते हैं

(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

VBA 15,000 TEN सेकंड में!

मुझे इन अन्य पदों के बाद बहुत कम उम्मीद थी। 16 जीबी रैम के साथ इंटेल 7 पर मुझे TEN सेकंड में 13-15,000 मिलते हैं। 4 जीबी रैम के साथ एक पेंटियम पर, मुझे TEN सेकंड में 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 के माध्यम के साथ एक त्रिकोण तक पहुंच गया। माध्यमों की गिनती 7,371 है।

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
PPCG में आपका स्वागत है!
मार्टिन एंडर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.