Open In App

Stella Octangula Number

Improve
Improve
Like Article
Like
Save
Share
Report

Given a number n, check it is the Stella Octangula number or not. A number of the form n(2n^{2} - 1)      where n is a whole number(0, 1, 2, 3, 4, …) is called Stella Octangula. First few Stella Octangula numbers are 0, 1, 14, 51, 124, 245, 426, 679, 1016, 1449, 1990, …
Stella octangula numbers which are perfect squares are 1 and 9653449.
Given a number x, check if it is Stella octangula.

Examples: 

Input:  x = 51
Output: Yes
Explanation: For n = 3, the value of expression n(2n2 – 1) is 51

Input: n = 53
Output: No

A simple solution is to run a loop starting from n = 0. For every n, check if n(2n2 – 1) is equal to x. We run the loop while value of n(2n2 – 1) is smaller than or equal to x.

An efficient solution is to use Unbounded Binary Search. We first find a value of n such that n(2n2 – 1) is greater than x using repeated doubling. Then we apply Binary Search.  

C++

// Program to check if a number is Stella
// Octangula Number
#include <bits/stdc++.h>
using namespace std;
 
// Returns value of n*(2*n*n - 1)
int f(int n) {
   return n*(2*n*n - 1);
}
 
// Finds if a value of f(n) is equal to x
// where n is in interval [low..high]
bool binarySearch(int low, int high, int x)
{
    while (low <= high) {
        long long mid = (low + high) / 2;
 
        if (f(mid) < x)
            low = mid + 1;
        else if (f(mid) > x)
            high = mid - 1;
        else
            return true;
    }
    return false;
}
 
// Returns true if x isStella Octangula Number.
// Else returns false.
bool isStellaOctangula(int x)
{
    if (x == 0)
      return true;
 
    // Find 'high' for binary search by
    // repeated doubling
    int i = 1;
    while (f(i) < x)
        i = i*2;
 
    // If condition is satisfied for a
    // power of 2.
    if (f(i) == x)
        return true;
 
    //  Call binary search
    return binarySearch(i/2, i, x);
}
 
// driver code
int main()
{
    int n = 51;
    if (isStellaOctangula(n))
        cout << "Yes";
    else
        cout << "No";
 
    return 0;
}

                    

Java

// Program to check if
// a number is Stella
// Octangula Number
import java.io.*;
 
class GFG
{
 
// Returns value of
// n*(2*n*n - 1)
static int f(int n)
{
    return n * (2 * n *
                n - 1);
}
 
// Finds if a value of
// f(n) is equal to x
// where n is in
// interval [low..high]
static boolean binarySearch(int low,
                            int high,
                            int x)
{
    while (low <= high)
    {
        int mid = (low + high) / 2;
 
        if (f(mid) < x)
            low = mid + 1;
        else if (f(mid) > x)
            high = mid - 1;
        else
            return true;
    }
    return false;
}
 
// Returns true if x
// is Stella Octangula
// Number.Else returns
// false.
static boolean isStellaOctangula(int x)
{
    if (x == 0)
    return true;
 
    // Find 'high' for
    // binary search by
    // repeated doubling
    int i = 1;
    while (f(i) < x)
        i = i * 2;
 
    // If condition is
    // satisfied for a
    // power of 2.
    if (f(i) == x)
        return true;
 
    // Call binary search
    return binarySearch(i / 2,
                        i, x);
}
 
// Driver code
public static void main (String[] args)
{
    int n = 51;
    if (isStellaOctangula(n))
        System.out.print("Yes");
    else
        System.out.print("No");
}
}
 
// This code is contributed
// by anuj_67.

                    

Python3

# Python3 program to check if a number
# is Stella octangula number
 
# Returns value of n*(2*n*n - 1)
def f(n):
     
    return n * (2 * n * n - 1);
 
# Finds if a value of f(n) is equal to x
# where n is in interval [low..high]
def binarySearch(low, high, x):
 
    while (low <= high):
        mid = int((low + high) // 2);
 
        if (f(mid) < x):
            low = mid + 1;
        elif (f(mid) > x):
            high = mid - 1;
        else:
            return True;
             
    return False;
 
# Returns true if x isStella octangula
#  number. Else returns false.
def isStellaOctangula(x):
 
    if (x == 0):
        return True;
 
    # Find 'high' for binary search
    # by repeated doubling
    i = 1;
    while (f(i) < x):
        i = i * 2;
 
    # If condition is satisfied for a
    # power of 2.
    if (f(i) == x):
        return True;
 
    # Call binary search
    return binarySearch(i / 2, i, x);
 
# Driver code
n = 51;
 
if (isStellaOctangula(n) == True):
    print("Yes");
else:
    print("No");
 
# This code is contributed by Code_Mech

                    

C#

// Program to check if
// a number is Stella
// Octangula Number
using System;
 
class GFG
{
 
// Returns value of
// n*(2*n*n - 1)
static int f(int n)
{
    return n * (2 * n *
                n - 1);
}
 
// Finds if a value of
// f(n) is equal to x
// where n is in
// interval [low..high]
static bool binarySearch(int low,
                         int high,
                         int x)
{
    while (low <= high)
    {
        int mid = (low + high) / 2;
 
        if (f(mid) < x)
            low = mid + 1;
        else if (f(mid) > x)
            high = mid - 1;
        else
            return true;
    }
    return false;
}
 
// Returns true if x
// is Stella Octangula
// Number.Else returns
// false.
static bool isStellaOctangula(int x)
{
    if (x == 0)
    return true;
 
    // Find 'high' for
    // binary search by
    // repeated doubling
    int i = 1;
    while (f(i) < x)
        i = i * 2;
 
    // If condition is
    // satisfied for a
    // power of 2.
    if (f(i) == x)
        return true;
 
    // Call binary search
    return binarySearch(i / 2,
                        i, x);
}
 
// Driver code
public static void Main ()
{
    int n = 51;
    if (isStellaOctangula(n))
        Console.WriteLine("Yes");
    else
        Console.WriteLine("No");
}
}
 
// This code is contributed
// by anuj_67.

                    

Javascript

<script>
 
// JavaScript program to check if
// a number is Stella
// Octangula Number
 
// Returns value of
// n*(2*n*n - 1)
function f(n)
{
    return n * (2 * n *
                n - 1);
}
   
// Finds if a value of
// f(n) is equal to x
// where n is in
// interval [low..high]
function binarySearch(low, high, x)
{
    while (low <= high)
    {
        let mid = (low + high) / 2;
   
        if (f(mid) < x)
            low = mid + 1;
        else if (f(mid) > x)
            high = mid - 1;
        else
            return true;
    }
    return false;
}
   
// Returns true if x
// is Stella Octangula
// Number.Else returns
// false.
function isStellaOctangula(x)
{
    if (x == 0)
    return true;
   
    // Find 'high' for
    // binary search by
    // repeated doubling
    let i = 1;
    while (f(i) < x)
        i = i * 2;
   
    // If condition is
    // satisfied for a
    // power of 2.
    if (f(i) == x)
        return true;
   
    // Call binary search
    return binarySearch(i / 2,
                        i, x);
}
 
// Driver code
 
    let n = 51;
    if (isStellaOctangula(n))
        document.write("Yes");
    else
        document.write("No");
           
          // This code is contributed by souravghosh0416.
</script>

                    

Output: 
Yes

 

Time Complexity: O(log n)
Auxiliary Space: O(1)



Last Updated : 10 Nov, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads