ফর্ম্যাট এর শেষ উপপাদ্য [বন্ধ]


49

একটি প্রোগ্রাম লিখুন, আপনার পছন্দের ভাষায়, যে মনে হচ্ছে, সফলভাবে করার জন্য একটি counterexample এটি ফের্মার শেষ উপপাদ্য । এটি হল, a , b , c > 0 এবং n > 2 এর মতো পূর্ণসংখ্যার সন্ধান করুন যা একটি এন + বি এন = সি এন

অবশ্যই, আপনি সত্যই এটি করতে পারবেন না , যদি না অ্যান্ড্রু ওয়াইলসের প্রমাণের কোনও ত্রুটি না থাকে। আমি এটি জাল মানে , নির্ভর করে

  • পূর্ণসংখ্যা ওভারফ্লো
  • ভাসমান-পয়েন্ট গোলাকার ত্রুটি
  • অপরিবর্তিত আচরণ
  • সংযোজন, ক্ষয়ক্ষতি বা সমতার অস্বাভাবিক সংজ্ঞা সহ ডেটা প্রকার
  • সংকলক / ইন্টারপ্রেটার বাগ
  • বা এই লাইন বরাবর কিছু।

আপনি হার্ড কোড কিছু বা ভেরিয়েবল সব may a, b, c, অথবা n, অথবা লুপ করে তাদের জন্য অনুসন্ধানের মত for a = 1 to MAX

এটি কোনও কোড গল্ফ নয়; এটি চালাক এবং সূক্ষ্ম সমাধানগুলির সন্ধানের একটি প্রতিযোগিতা।


প্রকৃতপক্ষে, আপনি ব্যয়কারী ছাড়াও এগুলির সকলের মতো থাকতে পারেন, যা 3 বা তার বেশি হতে হবে। সুতরাং, 1 ^ 3 + 1 ^ 3 = 1 ^ 3 এটি সহজ।

2
@ সেবার: 1³ + 1³ = 2; 1³ = 1; 2 ≠ 1
dan04

উত্তর:


57

জে

প্রকৃতপক্ষে, ফার্মাট যথেষ্ট ভুল করেছে: এটি কোনও বি, সি বা এন এর জন্য আসলে ভুল:

   1^3 + 4^3 = 5^3
1
   1^4 + 5^4 = 11^4
1
   1^9 + 3^9 = 42^9
1

সম্ভবত ঠিক হতে পারে, ফার্মের অগ্রাধিকারের নিয়মগুলি ডান থেকে বামে কঠোরভাবে ছিল না।


19
+1 সত্যিই ডান থেকে বামে সত্যই। কেবল বাম থেকে ডান পড়া লোকদের জন্য; 1^(9 + (3^(9 = (42^9))))
শেষেরটির

1
লুক্কায়িত, আমার মস্তিষ্কটি গলতে চলেছিল যতক্ষণ না আমি @ থেরের মন্তব্যটি দেখেছি
জার্মানি_গুই

3
এটি কি জে র একটি উদ্দেশ্যযুক্ত বৈশিষ্ট্য? এটি এমন এক জিনিস যা সত্যই মানুষকে উন্মাদ করে তোলে।
qwr

2
@Qwr জে, সমস্ত মূল্যায়ন কিছু ব্যতিক্রম সহ ডান থেকে বামে। এটি অদ্ভুত লাগছে তবে এটি বেশ ঝরঝরে।
seequ

1
@ dan04 কঠোরভাবে সত্য বলছেন না। 1^i.5মূল্যায়ন 1 1 1 1 1
20

36

টিআইবি-বেসিক

1782^12+1841^12=1922^12

আউটপুট (সত্য)

1


1
আমি এই পর্বটি প্রায়শই দেখেছি, এটি কখনই লক্ষ্য করিনি। চমৎকার ধরা!
dom0

1
এই উত্তরটি কেবল টিআই-89-স্বাদ টিআই-বেসিকের সাথে লিখিত হিসাবে কাজ করে। একটি টিআই -৪৪ + এসই-তে কোডটির একটি বাক্য গঠন ত্রুটি রয়েছে, কারণ টিআই-বেসিকের সেই সংস্করণটি ফাঁকা স্থান দেয় না। উত্তরটি এখনও পুরানো ক্যালকুলেটরের উপর কাজ করে যদি আপনি স্পেস, লেখালিখি সরিয়ে ফেলেন 1782^12+1841^12=1922^12
ররি ও'কেনে

1
টিআই-বেসিক ব্যবহারের জন্য +1, এটি আমার প্রথম প্রোগ্রামিং ভাষা ছিল :)
কিক

2
@ থানব্রিমহল এটি বিদ্রূপ, একটি সাধারণ গণিত সমস্যা ব্যর্থ ক্যালকুলেটর
qwr

35

জাভা

এই ফার্মাট লোকটি নিশ্চয় ঘুমাচ্ছে। আমি সমীকরণের কয়েকশ সমাধান পেয়েছি। আমি কেবল আমার এক্সেল সূত্রটি জাভা প্রোগ্রামে রূপান্তর করেছি।

public class FermatNoMore {
    public static void main(String[] args) {
        for (int n = 3; n < 6; n++)
            for (int a = 1; a < 1000; a++)
                for (int b = 1; b < 1000; b++)
                    for (int c = 1; c < 1000; c++)
                        if ((a ^ n + b ^ n) == (c ^ n))
                            System.out.println(String.format("%d^%d + %d^%d = %d^%d", a, n, b, n, c, n));
    }
}

^অপারেটর আসলে জাভা XOR যাও মানে যেমন টিপিক্যাল প্লেইন-টেক্সট exponentiation উল্টোদিকে


এটি কেন কাজ করে তার একটি বিশদ সম্পর্কিত কোনও সুযোগ?
মান 18

20
@ ভ্যালিটি: ^জাভাতে জোর , শক্তি নয়।
মেরিনাস

3
এই প্রযুক্তিগতভাবে প্রায় কোনও সি-ভিত্তিক ভাষায় কাজ করে
ফুলচলভি

19

সি ++

#include <cstdlib>
#include <iostream>

unsigned long pow(int a, int p) {
  unsigned long ret = a;

  for (int i = 1; i < p; ++i)
    ret *= a;

  return ret;
}

bool fermat(int n) {
  // surely we can find a counterexample with 0 < a,b,c < 256;
  unsigned char a = 1, b = 1, c = 1;

  // don't give up until we've found a counterexample
  while (true) {
    if (pow(a, n) + pow(b, n) == pow(c, n)) {
      // found one!
      return true;
    }

    // make sure we iterate through all positive combinations of a,b,c
    if (!++a) {
      a = 1;
      if (!++b) {
        b = 1;
        if (!++c)
          c = 1;
      }
    }
  }

  return false;
}

int main(int argc, char** argv) {
  if (fermat(std::atoi(argv[1])))
   std::cout << "Found a counterexample to Fermat's Last Theorem" << std::endl;
}

এর সাথে সংকলিত clang++ -O3 -o fermat fermat.cpp, পরীক্ষিত Ubuntu clang version 3.4.1-1~exp1 (branches/release_34) (based on LLVM 3.4.1):

./fermat 3
Found a counterexample to Fermat's Last Theorem

আমরা অবশ্যই একটি, বি, সি> 0 খুঁজে পেয়েছি যাতে একটি 3 + বি 3 = সি 3 (এটি n = 4, 5, 6, ...) এর জন্যও কাজ করে।

A, b এবং c মুদ্রণ কিছুটা কঠিন প্রমাণ হতে পারে যদিও ...


1
@ dan04: ওহো, ভুলে গেছি ++মধ্যে clang++
ভেন্টোরো

2
যাইহোক, এটি কোনও সংকলক বাগ নয়। সি (এবং সি ++) স্ট্যান্ডার্ড এখানে কিছু করার অনুমতি দেয়, যেমন val.uউপচে পড়তে পারে (এটি uint32_tপরিবর্তে অন্যটি হবে তবে )। তদতিরিক্ত, এই unionকোডটিও ভুল উপায়ে ব্যবহার করে (মান অনুসারে, আপনি একটি ক্ষেত্রে লিখতে এবং অন্য ক্ষেত্রটি পড়তে পারবেন না), তবে এটি অনেক সংকলক (তাদের ডকুমেন্টেশন অনুযায়ী) দ্বারা অনুমোদিত।
কনরাড বোরোস্কি

3
এটি অনুমোদিত হওয়ার কারণটি হ'ল সি ++ স্ট্যান্ডার্ডের একটি অংশ যা বলেছে: একটি লুপ যা স্টেটমেন্টের ক্ষেত্রে ফর-ইন-স্টেটমেন্টের বাইরে থাকে, * লাইব্রেরিতে আই / ও ফাংশনগুলিতে কোনও কল দেয় না এবং * করে না অস্থির অবজেক্টগুলিতে অ্যাক্সেস বা সংশোধন করে এবং * কোনও সিঙ্ক্রোনাইজেশন অপারেশন (1.10) বা পারমাণবিক ক্রিয়াকলাপ সম্পাদন করে না (ধারা 29) সমাপ্তির জন্য বাস্তবায়ন দ্বারা ধরে নেওয়া যেতে পারে।
dan04

3
@ ডান04 পরবর্তী খসড়ায় সেই সঠিক শব্দটি প্রকৃতপক্ষে মুছে ফেলা হয়েছে, ওপেন -std.org/jtc1/sc22/wg21/docs/papers/2010/n3196.htm এ 38 মার্কিন যুক্তরাষ্ট্র দেখুন - তবে অবশ্যই এটি কেবল হয়েছে সাধারণ। এই কারণেই মুদ্রণ আউট করা a,b,c(বা কোনও কিছু, সেই বিষয়ে) fermat()ফাংশনটি কখনই ফিরে আসে না।
ভেন্টোরো

8
আরগ আমি তাই পোস্ট করতে যাচ্ছি। যে কারও জন্য বিভ্রান্তি রয়েছে: জন রেগারের এখানে একটি সুন্দর ব্যাখ্যা রয়েছে
ভু

13

জাভা

দেখে মনে হচ্ছে যে উপপাদ্যটি n = 3 এর জন্য ধারণ করেছে তবে আমি n = 4 এর জন্য প্রতিবিম্ব উদাহরণ পেয়েছি:

public class Fermat {
    public static int p4(final int x) {
        return x * x * x * x;
    }

    public static void main(final String... args) {
        System.out.println(p4(64) + p4(496) == p4(528));
    }
}

আউটপুট:

true

ব্যাখ্যা:

সংখ্যাগুলি ছোট মনে হলেও, চতুর্থ শক্তিতে উঠলে তারা উপচে পড়ে। প্রকৃতপক্ষে, 64 4 + + 496 4 = 528 4 - 2 34 , কিন্তু আছে 2 34 যখন (32 বিট) int অবধি সীমিত 0 হয়ে যায়।


আপনি এই ব্যাখ্যা করতে পারেন?
অনুবিয়ান নুব

@ আনুবিয়ান নুব সম্পন্ন হয়েছে
অ্যাডিতসু

9

পাইথন

import math
print math.pow(18014398509481984,3) + math.pow(1, 3) \
      == math.pow(18014398509481983,3)

কে বলেছে যে থেকে বড় হওয়া উচিত একটি এবং b এর ?


2
এটি মুদ্রণ করে Trueকারণ গণিত.পো ভাসমান পয়েন্ট নম্বর দেয় এবং এগুলির সঠিক উত্তর পাওয়ার জন্য যথাযথ নির্ভুলতা নেই False,।
কর্নিগ

5

GolfScript

# Save the number read from STDIN in variable N and format for output.

:N"n="\+

{
  [{100rand)}3*] # Push an array of three randomly selected integers from 1 to 100.
  .{N?}/         # Compute x**N for each of the three x.
  +=!            # Check if the sum of the topmost two results equals the third.
}{;}while        # If it doesn't, discard the array and try again.

# Moar output formatting.

~]["a=""\nb=""\nc="""]]zip

এই পদ্ধতির বিভিন্ন সমাধানের একগুচ্ছ সন্ধান করে। উদাহরণ স্বরূপ:

$ golfscript fermat.gs <<< 3
n=3
a=43
b=51
c=82

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

প্রথম লাইনটি ~ইনপুটটি ব্যাখ্যা করার জন্য একটি দিয়ে শুরু করা উচিত । পরিবর্তে, উদাহরণস্বরূপ, 3 নম্বর, ভেরিয়েবল Nস্ট্রিং রয়েছে 3\n3 গণনা করার
সময় , ASCII কোড 2-এ (-1 খুঁজে পাওয়া যায়নি) সহ একটি অক্ষরের সূচককে ধাক্কা দেয় । এই ভাবে, এবং ধাক্কা এবং পাহাড় জমে (51 এর ASCII অক্ষর কোড )। যেহেতু , শর্তটি সন্তুষ্ট এবং এটি একটি "সমাধান"।2 3 ?2 N ?N
43 N ?82 N ?-151 N ?03
-1 + 0 = -1(43,51,82)


4

সি

অবশ্যই আপনারা সকলেই কাউন্টারেক্সটিক্সগুলি সন্ধান করছেন, আপনি পূর্ণসংখ্যার উপচে পড়া চালিয়ে যাচ্ছেন। এছাড়াও, আপনি সি হিসাবে পুনরাবৃত্তি দ্বারা সত্যই ধীর হয়ে যাচ্ছেন। এটি এটি করার একটি আরও ভাল উপায়!

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

int main(void) {
  double a, b, c;
  for (a = 2; a < 1e100; a *= 2) {
    for (b = 2; b < 1e100; b *= 2) {
      c = pow(pow(a, 3) + pow(b, 3), 1.0/3);
      if (c == floor(c)) {
        printf("%f^3 + %f^3 == %f^3\n", a, b, c);
      }
    }
  }
  return 0;
}

double পরিসীমাটিতে দুর্দান্ত হতে পারে তবে এটি এখনও যথাযথতার অভাবে ...


4

সি

আমরা সবাই পূর্ণসংখ্যার ওভারফ্লোগুলিকে ঘৃণা করি, তাই আমরা একটি ক্ষুদ্র ক্ষতিকারক nএবং কিছু ভাসমান পয়েন্ট রূপান্তর ব্যবহার করব । কিন্তু তবুও উপপাদ্যটি ধরে রাখেনি a = b = c = 2139095040

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

int a, b, c;
int n;

int disprove(int a, int b, int c, int n)
{
    // Integers are so prone to overflow, so we'll reinforce them with this innocent typecast.
    float safe_a = *((float *)&a);
    float safe_b = *((float *)&b);
    float safe_c = *((float *)&c);

    return pow(safe_a, n) + pow(safe_b, n) == pow(safe_c, n);
}

int main(void)
{
    srand(time(NULL));

    a = b = c = 2139095040;
    n = rand() % 100 + 3;

    printf("Disproved for %d, %d, %d, %d: %s\n", a, b, c, n, disprove(a, b, c, n) ? "yes" : "no");
}

আউটপুট:

Disproved for 2139095040, 2139095040, 2139095040, 42: yes

Disproved for 2139095040, 2139095040, 2139095040, 90: yes

আইইইই 754 তে, 2139095040 বা 0x7F800000 সংখ্যাটি একক নির্ভুলতা ভাসমান পয়েন্টের ধরণের ধনাত্মক অনন্ততাকে উপস্থাপন করে। সমস্ত pow(...)কল + ইনফিনিটি এবং + ইনফিনিটি সমান + ইনফিনিটি ফিরে আসবে। পাথাগোরিয়ান উপপাদ্যটি 0x7F800001 (শান্ত ন্যাএন) ব্যবহার করে প্রমাণ করার পক্ষে একটি সহজ কাজ হবে যা মান অনুযায়ী নিজের সমান নয়।


2

জাভাস্ক্রিপ্ট

var a, b, c, MAX_ITER = 16;
var n = 42;
var total = 0, error = 0;

for(a = 1 ; a <= MAX_ITER ; a++) {
  for(b = 1 ; b <= MAX_ITER ; b++) {
    for(c = 1 ; c <= MAX_ITER ; c++) {
      total++;
      if(Math.pow(a, n) + Math.pow(b, n) == Math.pow(c, n)) {
        error++;
        console.log(a, b, c);
      }
    }
  }
}

console.log("After " + total + " calculations,");
console.log("I got " + error + " errors but Fermat ain't one.");

42 আপনি জানেন।

> node 32696.js
After 2176 calculations,
I got 96 errors but Fermat ain't one.

এবং উইলসও এক নয়।

জাভাস্ক্রিপ্ট Numberযথেষ্ট বড় নয়।


2

টি-এসকিউএল

এই ফর্ম্যাট লোকটির উপপাদ্যকে অস্বীকার করার জন্য আমাদের কেবল একটি পাল্টা উদাহরণ খুঁজে নেওয়া দরকার। দেখে মনে হচ্ছে, তিনি অত্যন্ত অলস ছিলেন এবং কেবলমাত্র এটির জন্য ছোট্ট ক্রমান্বয়ে চেষ্টা করেছিলেন। আসলে তিনি চেষ্টাও করছিলেন না। আমি কেবল 0 <a, b, c <15 এবং 2 <e <15 এ একটি পাল্টা উদাহরণ খুঁজে পেয়েছি Sorry দুঃখিত, আমি মনের গল্ফার তাই আমি এই কোডটি পরে প্রকাশ করব না!

with T(e)as(select 1e union all select (e+1) from T where e<14)select isnull(max(1),0)FROM T a,T b,T c,T e where e.e>2 and power(a.e,e.e)+power(b.e,e.e)=power(c.e,e.e)

1 প্রদান করে, যার অর্থ আমরা একটি পাল্টা উদাহরণ পেয়েছি!

কৌতুকটি হ'ল প্রথম ই-এর মতো কোনও উপনামের মতো দেখা যাচ্ছে, এটি আসলে ই-এর ডাটা টাইপটি ইন্টি থেকে ভাসমান পয়েন্ট টাইপের পরিবর্তে ডাবলের সমতুল্য ne আমরা 14 এ পৌঁছানোর সময় আমরা ভাসমান পয়েন্ট সংখ্যাটির যথার্থতার বাইরে যাব যাতে আমরা এতে 1 যুক্ত করতে পারি এবং আমরা এখনও কিছু হারাতে পারি না। আরসিটিতে একটি কলামের ওরফে আমার আপাতদৃষ্টিতে মূর্খ ডাবল ঘোষণার ব্যাখ্যা দেওয়ার জন্য মিনিফিকেশনটি একটি দুর্দান্ত অজুহাত। যদি আমি এটি না করি তবে এটি 14 ^ 14 এ যাওয়ার অনেক আগেই উপচে পড়বে।


1

জাভাস্ক্রিপ্ট

দেখা যাচ্ছে যে এই লোকটি কিছু ঠিকঠাক ছিল। আমাকে জিজ্ঞাসা করলে ওষুধের দিকে। প্রতিবন্ধকতাগুলি দেওয়া, মানগুলির কোনও সেট পাওয়া যায়নি যার জন্য উপপাদ্যটি সত্য।

var a = 1,
    b = 1,
    c = 1,
    n = 3,
    lhs = (a^n + b^n),
    rhs = c^n;

alert(lhs === rhs);

জাভা হিসাবে, ^অপারেটরটি জাভাস্ক্রিপ্টে বিটওয়াইস এক্সওআর অপারেটর। কোনও সংখ্যার পাওয়ার গণনা করার সঠিক উপায় হ'ল ম্যাথ.পো ব্যবহার করা।


2
ফারম্যাট এর জন্য, এক্সপোনেন্ট ( n) হতে হবে >= 3
পুনরাবৃত্তি

ভাল কথা, কোডটি এখনও কাজ করে :)
থোমাক্স

0

আর একটি বেসিক কাউন্টারিক্স নমুনা

10 a = 858339
20 b = 2162359
30 c = 2162380
40 IF (a^10 + b^10) = c^10 THEN
50   PRINT "Fermat disproved!"
60 ENDIF
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.