জাভা - পূর্ণসংখ্যার উপর ভিত্তি করে
এই প্রোগ্রামটি পাই ব্যবহার করে না এবং কোনও বাহ্যিক ফাংশন কল করে না - এমনকি স্কয়ারটিও নয়। এটা শুধুমাত্র সহজ গাণিতিক ব্যবহার করে - +
, -
, *
এবং /
। তদুপরি, একটি স্কেলিং পদক্ষেপ ব্যতীত, এটি পূর্ণসংখ্যার সাথে একচেটিয়াভাবে কাজ করে। এটি মূলত গোলকটিকে সামান্য কিউবগুলিতে বিভক্ত করে এবং বাক্সের বাইরে যেগুলি গণনা করে।
public class Box {
private static final int MIN = 10000;
private static final int MAX = MIN * 2;
private static final int[] SQ = new int[MAX * MAX + 1];
static {
int t = 1;
for (int i = 1; i <= MAX; ++i) {
while (t < i * i) SQ[t++] = i - 1;
}
SQ[MAX * MAX] = MAX;
}
public static long outsideInt(int r, int w, int z) {
int r2 = r * r;
int o = z - r + 1;
if (w < r * 2) {
int t = 1 - SQ[r2 - w * w / 4];
if (t < o) o = t;
}
long v = 0;
for (int i = o; i <= r; ++i) {
int d = r2 - i * i;
int j0 = SQ[d];
v += 1 + 3 * j0;
for (int j = 1; j <= j0; ++j)
v += 4 * SQ[d - j * j];
}
return v;
}
public static double outside(double x, double y, double z, double d) {
double f = 1;
double w = x < y ? x : y;
double r = d / 2;
while (r < MIN) {
f *= 8;
r *= 2;
w *= 2;
z *= 2;
}
while (r > MAX) {
f /= 8;
r /= 2;
w /= 2;
z /= 2;
}
return outsideInt((int) r, (int) w, (int) z) / f;
}
public static void main(final String... args) {
System.out.println(outside(1, 1, 1, 1));
System.out.println(outside(1, 1, 0, 1));
System.out.println(outside(1, 1, 0.5, 1));
System.out.println(outside(1, 0.999, 1, 1));
System.out.println(outside(0.1, 1, 1, 0.5));
}
}
আউটপুট:
0.0
0.5235867850933005
0.26178140856157484
0.27938608275528054
0.06542839088004015
এই ফর্মটিতে, প্রোগ্রামটির জন্য 2 জিবি-র বেশি মেমরি প্রয়োজন (এটি -Xmx2300m
এখানে কাজ করে ) এবং এটি খুব ধীর গতির হয়। এটি স্মৃতিটিকে বর্গমূলের একগুচ্ছ প্রাক্কলক করতে ব্যবহার করে (গাণিতিকভাবে); এটি সত্যিই প্রয়োজনীয় নয়, তবে এটি ছাড়া এটি খুব ধীর হবে। মেমরির প্রয়োজনীয়তা এবং গতি উভয়ই উন্নত করতে MIN
ধ্রুবকের মান হ্রাস করুন (এটি যদিও সঠিকতা হ্রাস করবে)।