# Miscellaneous

## Juggling algorithm for array rotation

The Juggling Algorithm is an efficient method for rotating an array of elements to the left or right by a given number of positions. It is particularly useful when you need to rotate an array in-place without using extra space. The algorithm achieves this by moving elements of the array in cycles, where each cycle involves moving one set of elements to their correct positions.

### Steps of the Juggling Algorithm with Explanation

1. **Calculate GCD**:
   * Calculate the Greatest Common Divisor (GCD) of the array length `n` and the number of positions `d`. This step determines the number of cycles needed to rotate all elements.
2. **Perform Cyclic Rotations**:
   * Divide the array into `gcd` cycles, each starting from a specific index `i`.
   * For each cycle:
     * Initialize a temporary variable `temp` to hold the value of the current index `i`.
     * Initialize the current index `j` to `i`.
     * While true:
       * Calculate the new index `k` by adding the rotation distance `d` to `j`.
       * Handle wrap-around if `k` is greater than or equal to the length of the array `n` by subtracting `n` from `k`.
       * Check if `k` equals the initial index `i`. If true, break out of the loop as the cycle has completed.
       * Copy the element at index `arr[k]` to index `arr[j]`, effectively moving the element to its new position within the rotation cycle.
       * Update the current index `j` to `k` to prepare for the next iteration of the loop within the cycle.
     * After completing the cycle, assign the value of `temp` (initial element of the cycle) to the last index `j`. This step ensures that the entire cycle is properly rotated.

### Code

```java
package src.main.java;

public class ArrayRotation {
    // Function to calculate GCD of two numbers
    private static int gcd(int a, int b) {
        if (b == 0)
            return a;
        return gcd(b, a % b);
    }

    // Function to left rotate array by d positions
    private static void leftRotate(int[] arr, int d) {
        int n = arr.length;
        int gcd = gcd(n, d);

        for (int i = 0; i < gcd; i++) {
            int temp = arr[i];
            int j = i;
            while (true) {
                int k = j + d;
                if (k >= n)
                    k = k - n;
                if (k == i)
                    break;
                arr[j] = arr[k];
                j = k;
            }
            arr[j] = temp;
        }
    }

    // Utility function to print an array
    private static void printArray(int[] arr) {
        for (int num : arr) {
            System.out.print(num + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8};
        int d = 2;

        System.out.println("Original array:");
        printArray(arr);

        leftRotate(arr, d);

        System.out.println("Array after left rotation by " + d + " positions:");
        printArray(arr);
    }
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://www.pranaypourkar.co.in/the-programmers-guide/algorithm/set-1-miscellaneous.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
